我有一个 PostgreSQL 表,其名称item_log
为包含各种属性log
的类型列jsonb
。这些属性之一是delete_log
. 我根据字段和属性中值created_at
的存在来查询该表。non-null
delete_log
SELECT item_id
FROM item_log
WHERE created_at >= CURRENT_DATE - INTERVAL '15 days'
AND (log->>'delete_log') IS NOT NULL;
我正在考虑使用不同的索引策略来优化查询:
这是我尝试过的,
创建索引created_at
:当我没有将条件放入
(log->>'delete_log') IS NOT NULL
预期的查询中时,查询变得更快。当我提出这个条件甚至选择这个字段时,大约花了 40 分钟。
我猜想查询速度减慢是由于包含delete_log
. 当查询该字段时,它开始读TOAST
表并执行deTOAST
操作,这会显着增加 I/O 时间。
现在为了优化查询,我有几个选项:
- 添加复合索引
(created_at, log->>delete_log)
- 添加索引,
(log->>delete_log)
因为我已经有索引了created_at
?
另外,我还有一个困惑。
- 我应该选择什么索引类型
log->>delete_log
? log
并且,就上述查询的性能或存储而言,它与对整个字段本身进行索引有何不同?