【发布时间】:2021-11-25 01:28:31
【问题描述】:
Table - user
Columns:
id
name
age
account_id
deleted_at
Indexes:
"user_account_id_idx" btree (account_id)
"user_account_id_deleted_at_idx" btree (account_id, deleted_at)
Explain analyze SELECT * FROM user WHERE account_id = '00000010005009' AND deleted_at IS NULL;
Index Scan using user_account_id_idx on user (actual time=0.451..0.475 rows=1 loops=1)
Index Cond: (account_id = '00000010005009'::bpchar)
Filter: (deleted_at IS NULL)
查询是否应使用此索引 - user_account_id_deleted_at_idx。 知道我在这里做错了什么吗?
【问题讨论】:
-
为什么你认为其他索引会更有效率?另外:查询运行大约 0.027 毫秒秒 - 你需要多快?
-
您的表中有多少行。有时扫描文件比使用索引更快。
-
LIMIT 1没有ORDER BY是没有意义的。 SQL 集是无序的,你不能保证每次都能得到相同的记录。至于您的具体问题,如果统计数据表明大多数帐户只有一条记录,则使用较浅的索引可能会更有效。刷新表统计信息(使用ANALYZE),然后重试。但是,正如所指出的,如果它需要 27 微秒,你为什么要关心呢?让我印象深刻的是基于非代表性样本大小的过早优化。 -
是的,现在取消了限制。此外,我运行解释的环境中的记录较少。在实际的环境查询中大约需要 400 毫秒
-
那么请edit你的问题并从慢速环境中添加(完整的)执行计划
标签: sql postgresql query-optimization