[英]Creating GIN index on ILIKE postgres query
我正在使用 postgres 9.6。 我將 JSONB 數據存儲在一列中,我會提高一個查詢的性能。 在我的 json 數據中,我的name
列是文本。 我正在使用以下查詢查詢此數據。
SELECT "id", "body", "created_at", "updated_at"
FROM "read_models"
WHERE ((body ->> 'name') ILIKE '%asd%')
LIMIT 40 OFFSET 0;
下面是這個查詢的分析結果:
Limit (cost=0.00..33.58 rows=40 width=72) (actual
time=112.428..4071.757 rows=11 loops=1)
|
| -> Seq Scan on read_models
(cost=0.00..2636.90 rows=3141 width=72) (actual time=112.416..4071.646
rows=11 loops=1) |
| Filter: ((body ->> 'name'::text) ~~* '%asd%'::text)
|
| Rows Removed by Filter: 78516
|
| Planning time: 1.658 ms
|
| Execution time: 4071.847 ms
我為此屬性創建了以下索引:
CREATE EXTENSION pg_trgm;
CREATE INDEX idx_name ON read_models USING gin ((body ->> 'name') gin_trgm_ops);
我創建了不同的索引類型,但結果始終相同。 查詢時間和沒有任何索引一樣。 當我查詢該數據時,我看到 PG 不使用此索引。 我看到了很多關於如何在 postgres 中索引文本數據的信息,但我不明白為什么它在我的情況下不起作用。 謝謝你的幫助。
問題是你的 where 條件不是SARGABLE
您可以為LIKE 'ABC%'
使用索引,但不能為LIKE '%ABC%'
使用索引
檢查這些提示,即使對於 MySQL 也大多數也適用於 Postgres MySQL 索引TIPS
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.