Postgres查询不使用索引

时间:2019-03-06 04:56:02

标签: postgresql query-performance

我有一个具有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

我不确定索引发生了什么事!

1 个答案:

答案 0 :(得分:0)

OFFSETbad for query performance

原因是为了跳过前1000000行,数据库必须先查找然后丢弃它们。因此,数据库的工作与省略OFFSET子句的情况相同。

现在,表的顺序扫描比索引扫描便宜,因此仅当检索到的行数比顺序扫描少得多时,索引扫描才有优势。在某个时候,查询计划将“倾斜”,而PostgreSQL将假定索引扫描更便宜。您已经找到了确切的要点。

如果您的random_page_cost设置正确反映了您的硬件,则PostgreSQL会正确估计。简而言之,PostgreSQL做正确的事。