【问题标题】:PostgreSQL Index Isn't Used on QueryPostgreSQL 索引不用于查询
【发布时间】:2020-11-30 07:31:49
【问题描述】:

所以我有一个带有表的 PostgreSQL 数据库,该表可以跟踪数百万行设备的运动和燃料水平

当我使用此命令在time 列上创建索引时,查询速度更快:

create index gpsapi__index__time on gpsapi (time);

当我尝试像这样使用“EXPLAIN ANALYZE”运行简单命令时

EXPLAIN ANALYZE
SELECT *
FROM gpsapi g
WHERE g.time >= NOW() - '1 months'::interval;

它没有显示查询使用了我创建的索引

你知道如何解决这个问题吗?谢谢!

【问题讨论】:

  • 样本数据最好显示为formatted text。请参阅here,了解有关如何创建漂亮表格的一些提示。执行计划也是如此。格式化的纯文本更容易阅读。
  • 您返回了超过 90% 的表格。使用索引可能会更慢。

标签: sql postgresql


【解决方案1】:

如果您仔细阅读执行计划,您会发现 Postgres 告诉您,在大约 600 万条记录中,有 550 万条匹配 (> 90%)。根据统计数据,Postgres 很可能意识到它会返回表中总记录的很大一部分,并且放弃使用索引并扫描整个表会更快。

这里要理解的概念是,虽然您定义的索引确实可能让 Postgres 很快丢弃不匹配的记录,但它实际上增加了查找 SELECT * 中的值所需的时间。这样做的原因是,在命中索引中的叶节点时,Postgres 必须然后回溯到聚集索引/表以查找列值。假设您的查询将返回大部分表,那么直接扫描表会更快。

话虽如此,您的索引本质上没有任何问题。如果您的查询使用了更窄的范围,或者搜索了特定的时间戳,这样预期的结果集就足够小了,那么 Postgres 很可能会使用该索引。

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2012-05-21
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多