首页 > 解决方案 > 在 postgres 中执行 where 和 order by 查询时的奇怪行为

问题描述

背景:一个50M+的大表,查询中的所有列都被索引了。

当我做这样的查询时:

select * from table where A=? order by id DESC limit 10;

在语句中,A、id 都被索引。
现在发生了令人困惑的事情:

我在这里有一个猜测:postgres 先做order by,然后做where,所以当目标行集很小时,在有序索引中找到 10 行会花费更多时间(比如在海滩上找到 10 个特定的沙子);相反,如果目标行集很大,很容易找到前 10 个。

这样对吗?或者还有其他原因?

最后一个问题:如何优化这种情况?

标签: sqlpostgresql

解决方案


它可以使用 A 上的索引来应用选择性,然后按“id”排序并应用限制。或者它可以使用“id”上的索引按顺序读取它们,然后过滤掉满足A条件的那些,直到找到其中的10个。它会选择它认为更快的那个,有时它会做出错误的选择。

如果你有一个多列索引,(A,id)它可以使用那个索引来做这两件事,在 A 上获得选择性,同时仍然按“id”获取已经按顺序排列的。


推荐阅读