11.3. 多列索引

81 阅读3分钟

11.3. 多列索引

可以在表的多个列上定义索引。例如,如果您有此形式的表:

CREATE TABLE test2 (
  major int,
  minor int,
  name varchar
);

(比如说,你把你的目录保存在数据库中...而且您经常发出以下查询:/dev

SELECT name FROM test2 WHERE major = constant AND minor = constant;

那么在列上定义一个索引并一起定义一个索引可能是合适的,例如:major``minor

CREATE INDEX test2_mm_idx ON test2 (major, minor);

目前,只有 B 树、GiST、GIN 和 BRIN 索引类型支持多列索引。最多可以指定 32 列。(构建 PostgreSQL 时可以更改此限制;请参阅文件。pg_config_manual.h

多列 B 树索引可以与涉及索引列的任何子集的查询条件一起使用,但当前导(最左侧)列存在约束时,索引效率最高。确切的规则是,前导列上的相等约束,加上第一列上没有相等约束的任何不相等约束,将用于限制扫描的索引部分。这些列右侧的列的约束在索引中被选中,因此它们节省了对表的访问,但它们不会减少必须扫描的索引部分。例如,给定一个索引和一个查询条件,索引必须从第一个条目 = 5 和 = 42 到最后一个条目 = 5 进行扫描。>= 77 的索引条目将被跳过,但仍需要扫描它们。原则上,此索引可用于具有约束和/或没有约束的查询 - 但必须扫描整个索引,因此在大多数情况下,计划者更喜欢顺序表扫描而不是使用该索引。(a, b, c)``WHERE a = 5 AND b >= 42 AND c < 77``a``b``a``c``b``c``a

多列 GiST 索引可以与涉及索引列的任何子集的查询条件一起使用。其他列上的条件限制索引返回的条目,但第一列上的条件是确定需要扫描多少索引的最重要条件。如果 GiST 索引的第一列只有几个非重复值,则其效率相对较低,即使其他列中有许多非重复值也是如此。

多列 GIN 索引可以与涉及索引列的任何子集的查询条件一起使用。与 B 树或 GiST 不同,无论查询条件使用哪个索引列,索引搜索效果都是相同的。

多列 BRIN 索引可以与涉及索引列的任何子集的查询条件一起使用。与 GIN 不同,与 B 树或 GiST 不同,无论查询条件使用哪个索引列,索引搜索效果都是相同的。在单个表上具有多个 BRIN 索引而不是一个多列 BRIN 索引的唯一原因是具有不同的存储参数。pages_per_range

当然,每列必须与适合索引类型的运算符一起使用;涉及其他运营商的条款将不予考虑。

应谨慎使用多列索引。在大多数情况下,单个列上的索引就足够了,并且可以节省空间和时间。具有三列以上列的索引不太可能有用,除非表的使用非常风格化。另请参阅第 11.5 节和第 11.9 节,了解不同索引配置的优点。