# 11.3.
多列索引可以在表的多个列上定义索引。
CREATE TABLE test2 (
major int,
minor int,
name varchar
);
例如,如果您有一个这种形式的表:(比如说,你保留你的
/dev
SELECT name FROM test2 WHERE major = constant AND minor = constant;
数据库中的目录...)并且您经常发出以下查询:那么在列上定义索引可能是合适的
重大的和
次要的
CREATE INDEX test2_mm_idx ON test2 (major, minor);
一起,例如:目前,只有 B-tree、GiST、GIN 和 BRIN 索引类型支持多键列索引。是否可以有多个键列与是否
包括列可以添加到索引中。索引最多可以有 32 列,包括
包括列。(在构建 PostgreSQL 时可以更改此限制;请参阅文件pg_config_manual.h
.)
多列 B 树索引可用于涉及索引列的任何子集的查询条件,但当前导(最左侧)列存在约束时,索引效率最高。确切的规则是前导列上的等式约束,加上没有等式约束的第一列上的任何不等式约束,将用于限制扫描的索引部分。在索引中检查这些列右侧的列的约束,因此它们可以正确保存对表的访问,但它们不会减少必须扫描的索引部分。例如,给定一个索引(a, b, c)
和一个查询条件其中 a = 5 且 b >= 42 且 c < 77
,索引必须从第一个条目开始扫描一种
= 5 和b
=42,直到最后一个条目A.
= 5. 带有c
>=77将被跳过,但仍需对其进行扫描。原则上,该索引可用于对b
和/或c
不受限制地A.
-但是必须扫描整个索引,因此在大多数情况下,计划人员更喜欢顺序表扫描,而不是使用索引。
多列GiST索引可以与涉及索引列的任何子集的查询条件一起使用。附加列上的条件限制了索引返回的条目,但第一列上的条件是决定需要扫描多少索引的最重要条件。如果GiST索引的第一列只有几个不同的值,即使其他列中有许多不同的值,GiST索引也会相对无效。
多列GIN索引可以与涉及索引列的任何子集的查询条件一起使用。与B-树或GiST不同,无论查询条件使用哪个索引列,索引搜索的有效性都是相同的。
多列BRIN索引可以与涉及索引列的任何子集的查询条件一起使用。与GIN一样,与B树或GiST不同,无论查询条件使用哪个索引列,索引搜索的有效性都是相同的。在一个表上使用多个BRIN索引而不是一个多列BRIN索引的唯一原因是使用不同的每个范围的页数
存储参数。
当然,每一列都必须使用适合索引类型的运算符;涉及其他运营商的条款将不予考虑。
多列索引应谨慎使用。在大多数情况下,一列索引就足够了,可以节省空间和时间。如果表的使用非常程式化,超过三列的索引不太可能有用。另见第11.5节和第11.9节有关不同索引配置的优点的一些讨论。