假设我有一个包含字段A
和的表B
。我在A
+上进行常规查询B
,所以我在 上创建了一个复合索引(A,B)
。A
复合索引是否也会对查询进行全面优化?
此外,我在 上创建了一个索引A
,但 Postgres 仍然只使用复合索引来查询A
。如果前面的答案是肯定的,我想这并不重要,但是为什么它默认选择复合索引,如果单个A
索引可用?
Postgres 文档声明了以下有关仅索引扫描和覆盖索引的内容:
如果您经常运行类似的查询
SELECT y FROM tab WHERE x = 'key';
加速此类查询的传统方法是仅在 x 上创建索引。然而,索引定义为
CREATE INDEX tab_x_y ON tab(x) INCLUDE (y);
可以将这些查询作为仅索引扫描来处理,因为可以从索引中获取 y 而无需访问堆。
因为列 y 不是索引搜索键的一部分,所以它不必是索引可以处理的数据类型;它仅存储在索引中,并且不被索引机制解释。另外,如果索引是唯一索引,即
CREATE UNIQUE INDEX tab_x_y ON tab(x) INCLUDE (y);
唯一性条件仅适用于 x 列,不适用于 x 和 y 的组合。(INCLUDE 子句也可以用 UNIQUE 和 PRIMARY KEY 约束编写,为设置这样的索引提供替代语法。)
问题1:如果 的数据类型y
可以添加到索引中,并且没有唯一性要求,那么使用CREATE INDEX tab_x_y ON tab(x) INCLUDE (y)
overCREATE INDEX tab_x_y ON tab(x, y)
进行查询有什么优势SELECT y FROM tab WHERE x = 'key';
?
在向索引添加非键有效负载列(尤其是宽列)时保持保守是明智的做法。如果索引元组超过索引类型允许的最大大小,数据插入将失败。在任何情况下,非键列都会复制索引表中的数据并使索引的大小膨胀,从而可能会减慢搜索速度。 …