postgresql - 如何索引并使 WHERE 子句不区分大小写?
问题描述
在PostgreSQL 12中有这个表,没有索引
CREATE TABLE tbl
(
...
foods json NOT NULL
)
样本记录:
foods:
{
"fruits": [" 2 orange ", "1 apple in chocolate", " one pint of berry"],
"meat": ["some beef", "ground beef", "chicken",...],
"veg": ["cucumber"]
}
需要选择所有满足的记录:
- 水果含有
orange
。 - AND 肉包含
beef
orchicken
。
select * from tbl where foods->> 'fruits' LIKE '%ORANGE%' and (foods->> 'meat' LIKE '%beef%' or foods->> 'meat' LIKE '%chicken%')
它是一个优化的查询吗?(我来自 RDBMS 世界)
如何索引以获得更快的响应而不是过度杀伤,以及如何使 PostgreSQL 不区分大小写?
解决方案
这会让你不开心。
您需要两个 trigram GIN 索引来加快速度:
CREATE EXTENSION pg_trgm;
CREATE INDEX ON tbl USING gin ((foods ->> 'fruits') gin_trgm_ops);
CREATE INDEX ON tbl USING gin ((foods ->> 'meat') gin_trgm_ops);
这些索引可能会变大并且会影响数据修改性能。
然后,您需要重写查询以使用ILIKE
.
最后,查询可能比您想要的要慢,因为它将使用三个索引扫描和一个(可能很昂贵的)位图堆扫描。
但是对于这样的数据结构和子字符串匹配,你不能做得更好。
推荐阅读
- android - Jetpack Compose - 立柱 - 重心
- laravel - 只有一个刀片而不是 12 个
- javascript - 如何从 JavaScript 中的 JSON 树获取嵌套的父路径?
- c++ - 如何将 OpenMP 和 MPI 导入大型 CLion CMake 项目?
- snowflake-cloud-data-platform - 如何在 SnowFlake 中加入 query_id 和 METADATA$ROW_ID
- python-3.x - 有什么方法可以找到多个图像的边界并单独裁剪它们?
- r - 从一系列网页中解析图表
- python - 将原始 CFA 缓冲区保存到原始图像
- javascript - 阿波罗客户端在反应原生的初始重新加载中返回未定义
- javascript - 如何使用私有方法正确配置 ES6 类的 eslint?