【问题标题】:psql not using the right index for select query?psql 没有使用正确的索引进行选择查询?
【发布时间】: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


【解决方案1】:

PostgreSQL 认为这两个索引对于这个查询同样适用,可能是因为account_id = '00000010005009' 已经是一个非常有选择性的条件。在所有其他条件相同的情况下,PostgreSQL 更喜欢扫描较小的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2017-05-27
    • 2014-07-20
    • 2021-08-29
    相关资源
    最近更新 更多