簡體   English   中英

在 ILIKE postgres 查詢上創建 GIN 索引

[英]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

是什么讓 SQL 語句變得可搜索?

您可以為LIKE 'ABC%'使用索引,但不能為LIKE '%ABC%'使用索引

檢查這些提示,即使對於 MySQL 也大多數也適用於 Postgres MySQL 索引TIPS

暫無
暫無

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

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