如果我的索引是部分的,它会在性能/索引大小上产生明显的不同吗?

时间:2016-11-30 14:05:38

标签: postgresql indexing partial-index

假设我有一个包含2000万行的表,我想像这样编制索引:

CREATE INDEX fruit_color
  ON fruits
  USING btree
  (color);

现在让我们说只有2%的水果有颜色,休息时间为NULL。我的查询将从不想要找到颜色为NULL(没有颜色)的水果,所以问题是,如果我将索引更改为:

,它会对postgresql产生影响吗?
 CREATE INDEX fruit_color
  ON fruits
  USING btree
  (color)
  WHERE color IS NOT NULL;

我对postgresql处理索引的内部方式了解不多,所以这就是我要问的原因。

PS postgresql版本是9.2

1 个答案:

答案 0 :(得分:0)

是的,这会有所作为。差异有多大取决于索引的使用方式。

如果只有一种具有一定颜色的水果,并且你通过颜色搜索这种水果,它就不会产生太大影响;可能会少一个页面被访问(因为索引可能有一个深度更少)。

如果有许多某种颜色的果实,那么改进会很好,因为扫描整个索引(用于位图索引扫描)或更大部分(对于常规索引或索引)会更便宜只扫描)。 如果索引很大,PostgreSQL将更不愿意扫描整个索引,而是可能会选择顺序表扫描。