Postgresql 在ILIKE postgres查询上创建GIN索引

Postgresql 在ILIKE postgres查询上创建GIN索引,postgresql,indexing,jsonb,Postgresql,Indexing,Jsonb,我正在使用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.0

我正在使用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中索引文本数据的信息,我不明白为什么它在我的案例中不起作用。谢谢您的帮助。

问题在于您的情况不符合SARGABLE

您可以对像“ABC%”这样的
使用索引,但不能对像“%ABC%”这样的
使用索引

查看这些提示,即使是MySQL,大多数人也会申请Postgres
MySQL索引

您有什么建议如何替换
ILIKE%asd%
?解决方案是什么?您可以使用,但我还没有将其用于JSON字段。好的,我明白了。现在我需要弄清楚如何用文本搜索操作符替换我的
LIKE
查询。如果你有一些教程(比文档更容易进入),请在这里发布。谢谢