postgresql - 在 ILIKE postgres 查询上创建 GIN 索引

标签 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.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

What makes a SQL statement sargable?

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

检查那些提示,即使对于 MySQL,大多数人也适用于 Postgres MySQL 索引 TIPS

关于postgresql - 在 ILIKE postgres 查询上创建 GIN 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47539068/

相关文章:

c# - 可以在 Dictionary 继承的类中重新定义索引器吗?

sql-server - 所有 SQL Server 版本都会自动重建索引还是有默认的重建标准?

java - JSON-B 将日期字符串反序列化为 joda DateTime 而不更改模型类

node.js - Sequelize : findAll with include where id is in a jsonb

postgresql - 快速获取最后插入的 n 行

sql - 根据另一个表中的条件选择一个表中的记录

sql - 在 WHERE 子句中将字符串数组单一转换为自定义枚举类型

sql-server - 聚集索引和非聚集索引之间的性能差异

json - 将列中的结果设置为列名称

.net - 为什么查询在超时限制内超时?