查询中不使用 PostgreSQL 索引

fah*_*dul 2 sql postgresql

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

记录

并在time使用此命令在列上创建索引时使查询更快:

create index gpsapi__index__time on gpsapi (time);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Tim*_*sen 7

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

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

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