我正在尝试添加作为枚举类型字段(状态)的索引,但是在解释查询中看不到该索引的任何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)
答案 0 :(得分:2)
由于表中的值published
如此“受欢迎”,因此PostgreSQL的SQL优化器似乎认为使用顺序表扫描比使用索引便宜。
为什么?因为单次读取堆很可能会找到具有该值的行(由于其无所不在)。很少需要第二个I / O操作来读取第二个堆块。
使用索引(您期望的索引)的另一种选择将需要:
这比立即击中堆更昂贵。
非常聪明。