sql - 在 postgres 中执行 where 和 order by 查询时的奇怪行为
问题描述
背景:一个50M+的大表,查询中的所有列都被索引了。
当我做这样的查询时:
select * from table where A=? order by id DESC limit 10;
在语句中,A、id 都被索引。
现在发生了令人困惑的事情:
- 返回的行越多
where
,整个 sql 花费的时间越少 - 返回的行越少
where
,整个 sql 花费的时间就越多
我在这里有一个猜测:postgres 先做order by
,然后做where
,所以当目标行集很小时,在有序索引中找到 10 行会花费更多时间(比如在海滩上找到 10 个特定的沙子);相反,如果目标行集很大,很容易找到前 10 个。
这样对吗?或者还有其他原因?
最后一个问题:如何优化这种情况?
解决方案
它可以使用 A 上的索引来应用选择性,然后按“id”排序并应用限制。或者它可以使用“id”上的索引按顺序读取它们,然后过滤掉满足A条件的那些,直到找到其中的10个。它会选择它认为更快的那个,有时它会做出错误的选择。
如果你有一个多列索引,(A,id)
它可以使用那个索引来做这两件事,在 A 上获得选择性,同时仍然按“id”获取已经按顺序排列的。
推荐阅读
- geant4 - 使用 Geant4 运行 exampleB1.exe 时未找到 ENSDFSTATE.dat 文件错误
- java - 骆驼sql存储的java,无法输入数组作为oracle存储过程的输入参数
- java - 如何使用处理在单独的线程中读取 OpenGL 像素?
- migration - 如何从主应用程序运行另一个应用程序的迁移
- php - 试图过滤品牌名称但它不起作用
- python-3.x - 您可以删除一个随机的逗号字符串并替换为一个以导出到 CSV
- javascript - 舍入函数给出不同的结果
- python - 获取 JSON 文件的语法错误
- c# - 如何使用 AutoMapper 将从 ForMember() 中的函数调用获得的值传递给另一个值
- python - NumPy 的字符串数组的内存使用量远大于对象数组