簡體   English   中英

LIKE的SELECT語句中未使用GIST索引

[英]GIST index not used in SELECT statement with LIKE

在PostgreSQL 8.3中(很抱歉,過時的版本-我無法更改它)我有一個這樣的表:

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

該表具有 5萬條記錄

我已經成功創建了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”一起使用(並獲得極快的速度),但我無法找到子字符串匹配項,這是必需的。 全文搜索只能找到整個單詞是否正確?

問題是您的版本過舊。
這可以在現代PostgreSQL上正常工作:

第9.3頁的SQL Fiddle演示。

但是在pg 8.3中沒有:

適用於pg 8.3的SQL Fiddle演示。

Postgres 9.1增加了對此的支持。 每個發行說明

E.28.3.13.2。 性能

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM