[英]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上正常工作:
但是在pg 8.3中沒有:
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.