假设我有一个包含2000万行的表,我想像这样编制索引:
CREATE INDEX fruit_color
ON fruits
USING btree
(color);
现在让我们说只有2%的水果有颜色,休息时间为NULL
。我的查询将从不想要找到颜色为NULL
(没有颜色)的水果,所以问题是,如果我将索引更改为:
CREATE INDEX fruit_color
ON fruits
USING btree
(color)
WHERE color IS NOT NULL;
我对postgresql处理索引的内部方式了解不多,所以这就是我要问的原因。
PS postgresql版本是9.2
答案 0 :(得分:0)
是的,这会有所作为。差异有多大取决于索引的使用方式。
如果只有一种具有一定颜色的水果,并且你通过颜色搜索这种水果,它就不会产生太大影响;可能会少一个页面被访问(因为索引可能有一个深度更少)。
如果有许多某种颜色的果实,那么改进会很好,因为扫描整个索引(用于位图索引扫描)或更大部分(对于常规索引或索引)会更便宜只扫描)。 如果索引很大,PostgreSQL将更不愿意扫描整个索引,而是可能会选择顺序表扫描。