为什么在解释查询中看不到枚举类型索引?

时间:2019-03-14 19:58:53

标签: sql postgresql indexing enums

我正在尝试添加作为枚举类型字段(状态)的索引,但是在解释查询中看不到该索引的任何index scan。无法理解我的想法。

-- t_post_status = ('waiting', 'published', 'deleted')

create index status ON public."Post" USING btree ((status::t_post_status))

因此,当我运行以下查询时,得到的结果如下;

explain select id from "Post" where status = 'published' limit 1
explain select id from "Post" where status = 'published'::t_post_status limit 1

Limit  (cost=0.00..0.20 rows=1 width=4)
  ->  Seq Scan on "Post"  (cost=0.00..5692.64 rows=29192 width=4)
        Filter: (status = 'published'::t_post_status)

但是,在这些情况下,我可以看到index scan的ID(或更改查询时的其他索引);

explain select id from "Post" where status = 'published' and id = 1 limit 1
explain select id from "Post" where status = 'published'::t_post_status and id = 1 limit 1

Limit  (cost=0.29..8.31 rows=1 width=4)
  ->  Index Scan using "Post_pkey" on "Post"  (cost=0.29..8.31 rows=1 width=4)
        Index Cond: (id = 1)
        Filter: (status = 'published'::t_post_status)

1 个答案:

答案 0 :(得分:2)

由于表中的值published如此“受欢迎”,因此PostgreSQL的SQL优化器似乎认为使用顺序表扫描比使用索引便宜。

为什么?因为单次读取堆很可能会找到具有该值的行(由于其无所不在)。很少需要第二个I / O操作来读取第二个堆块。

使用索引(您期望的索引)的另一种选择将需要:

  • 索引走动。
  • 然后读取一个堆。

这比立即击中堆更昂贵。

非常聪明。