postgresql - Postgres查询不使用索引
问题描述
我有一张有 2000000 条记录的表。我有一个索引:
CREATE INDEX test
ON public."PaymentReceipt" USING btree
("CompanyID" DESC NULLS LAST, created_at ASC NULLS LAST)
TABLESPACE pg_default;
如果我运行此查询,它将运行索引:
explain
select *
from public."PaymentReceipt"
where "CompanyID" = '5c67762bd0949'
order by "created_at" desc
limit 100 offset 1600589
但是如果我运行这个查询,它不会使用索引:
explain
select *
from public."PaymentReceipt"
where "CompanyID" = '5c67762bd0949'
order by "created_at" desc
limit 100 offset 1600590
我不确定索引发生了什么!
解决方案
OFFSET
对查询性能不利。
原因是为了跳过前 1000000 行,数据库必须找到然后丢弃它们。因此,数据库的工作与省略该OFFSET
子句相同。
现在,表的顺序扫描比索引扫描便宜,因此后者只有在检索的行数比顺序扫描少得多的情况下才有优势。在某些时候,查询计划会“倾斜”,而 PostgreSQL 会假设索引扫描更便宜。你已经找到了这一点。
如果您的random_page_cost
设置正确地反映了您的硬件,PostgreSQL 将正确估计这一点。简而言之,PostgreSQL 正在做正确的事情。
推荐阅读
- node.js - 节点/mongoDB 遇到问题
- scala - 无法将 spark DF 写为 parquert 文件错误:java.lang.NoSuchMethodError: org.json4s.jackson.JsonMethods
- go - 按给定切片对切片字符串进行排序/排序
- angularjs - 在 Angular JS ui-router 中获取接收到的 Http Headers
- python - 用于氨基酸描述符的 R 库
- java - 我的 java spring boot 代码有什么问题
- java - 解析百里香文本模板中的特殊字符
- android - 由于无效原因,我的应用被 Instagram Basic Display API 审核拒绝
- laravel-6 - 在 Laravel 中删除或导出一个完整的模块
- python - 如何在函数中定义模型的名称