如何在不使用全文搜索的情况下提高查询速度?

时间:2011-01-06 11:42:47

标签: sql performance optimization postgresql

这是我的简单查询;通过搜索selectnothing我确定我没有点击。

SELECT nome_t FROM myTable WHERE nome_t ILIKE '%selectnothing%';

这是EXPLAIN ANALYZE VERBOSE

Seq Scan on myTable  (cost=0.00..15259.04 rows=37 width=29) (actual time=2153.061..2153.061 rows=0 loops=1)
  Output: nome_t
  Filter: (nome_t ~~* '%selectnothing%'::text)
Total runtime: 2153.116 ms

myTable有大约350k行,表定义类似于:

CREATE TABLE myTable (
    nome_t text NOT NULL,
)

我有一个关于nome_t的索引,如下所述:

CREATE INDEX idx_m_nome_t ON myTable
USING btree (nome_t);

虽然这显然是全文搜索的一个很好的选择,但我想暂时排除该选项。
此查询旨在从Web应用程序运行,目前它需要大约2秒,这显然太多了;
我可以做些什么,比如使用其他索引方法来提高此查询的速度?

2 个答案:

答案 0 :(得分:4)

不,ILIKE'%selectnothing%'总是需要全表扫描,每个索引都没用。您需要全文搜索,这并不难实现。


编辑:您可以使用Wildspeed,我忘了这个选项。索引将是巨大的,但你的表现也会好得多。

  

Wildspeed扩展提供GIN索引   支持LIKE的通配符搜索   操作

http://www.sai.msu.su/~megera/wiki/wildspeed

答案 1 :(得分:1)

你可以做的另一件事 - 将表myTable中的这个nome_t列拆分为它自己的表。从表中搜索一列很慢(如果有其他五十个宽列),因为其他数据会有效地减慢对该列的扫描速度(因为每页/范围的记录较少)。