如果我的索引是部分索引,它会在 performance/index 大小上产生明显的不同吗?
Will it make a noticeable different in performance/index size if my index is made partial?
假设我有一个包含 2000 万行的 table,我想像这样建立索引:
CREATE INDEX fruit_color
ON fruits
USING btree
(color);
现在假设只有2%的水果有颜色,剩下的就是NULL
。我的查询 NEVER 想要找到颜色为 NULL
(无颜色)的水果,所以问题是,如果我将索引更改为:
CREATE INDEX fruit_color
ON fruits
USING btree
(color)
WHERE color IS NOT NULL;
我不太了解 postgresql 内部处理索引的方式,所以这就是我问的原因。
PS postgresql 版本为 9.2
是的,这会有所作为。差异有多大取决于索引的使用方式。
如果某种颜色的水果只有一个,你按颜色搜索这个水果,差别不大;可能会少访问一页(因为索引可能少了一层深度)。
如果某种颜色的水果很多,改进会很大,因为扫描整个索引(对于位图索引扫描)或其中的大部分(对于常规或仅索引扫描)。
如果索引很大,PostgreSQL 将不太愿意扫描完整索引,可能会选择顺序 table 扫描。
假设我有一个包含 2000 万行的 table,我想像这样建立索引:
CREATE INDEX fruit_color
ON fruits
USING btree
(color);
现在假设只有2%的水果有颜色,剩下的就是NULL
。我的查询 NEVER 想要找到颜色为 NULL
(无颜色)的水果,所以问题是,如果我将索引更改为:
CREATE INDEX fruit_color
ON fruits
USING btree
(color)
WHERE color IS NOT NULL;
我不太了解 postgresql 内部处理索引的方式,所以这就是我问的原因。
PS postgresql 版本为 9.2
是的,这会有所作为。差异有多大取决于索引的使用方式。
如果某种颜色的水果只有一个,你按颜色搜索这个水果,差别不大;可能会少访问一页(因为索引可能少了一层深度)。
如果某种颜色的水果很多,改进会很大,因为扫描整个索引(对于位图索引扫描)或其中的大部分(对于常规或仅索引扫描)。 如果索引很大,PostgreSQL 将不太愿意扫描完整索引,可能会选择顺序 table 扫描。