使用LIKE在SELECT语句中不使用GIST索引

时间:2014-07-03 12:29:29

标签: postgresql postgresql-8.3

在PostgreSQL 8.3中(对不起过时的版本 - 我无法改变)我有一个这样的表:

CREATE TABLE tablephonebook
(
  id bigserial NOT NULL,
  name1 text,
  name2 text,
  number text,
  ...
  CONSTRAINT tablephonebook_pkey PRIMARY KEY (id)
)

桌子有大约50 000条记录。

我已成功创建了GIST索引:

CREATE INDEX trgm_idx ON tablephonebook USING gist (name1 gist_trgm_ops, name2 gist_trgm_ops);

使用LIKE(或ILIKE)运算符进行文本搜索需要太长时间,并且不使用GIST索引:

EXPLAIN ANALYZE SELECT id, name1, name2
  WHERE name1 ILIKE '%south%'
     OR name2 ILIKE '%south%'
   FROM tablephonebook
  ORDER BY id
  LIMIT 1000;

Limit  (cost=0.00..10737.05 rows=903 width=80) (actual time=333.125..333.125 rows=0 loops=1)
  ->  Seq Scan on tablephonebook  (cost=0.00..10737.05 rows=903 width=80) (actual time=333.123..333.123 rows=0 loops=1)"
      Filter: ((name1 ~~* '%south%'::text) OR (name2 ~~* '%south%'::text))
Total runtime: 333.155 ms

我做错了什么?我读过LIKE / ILIKE使用这个单词索引。

作为一种替代方法,我尝试使用带有“to_tsquery”的全文搜索(并获得华丽的速度),但我无法找到子串匹配,这是一项要求。全文搜索只能找到整个单词吗?

1 个答案:

答案 0 :(得分:1)

你过时的版本就是问题 这与现代PostgreSQL预期的一样:

SQL Fiddle demo for pg 9.3.

但不是在第8.3页:

SQL Fiddle demo for pg 8.3.

Postgres 9.1增加了对此的支持。 Per release notes

  

E.28.3.13.2。性能

Add support for `LIKE` and `ILIKE` index searches to `contrib/pg_trgm` (Alexander Korotkov)