↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.

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 实现支持多列索引。最多可以指定 32 个列。(在构建 PostgreSQL 时可以改变这个限制;参见文件 pg_config_manual.h。)

查询规划器可以把多列索引用于涉及索引定义中最左列加上它右侧任意多个连续列(不能有空档)的查询。例如,一个定义在(a, b, c) 上的索引可以用于涉及a、b、c 全部的查询,或涉及 a 和 b 两者的查询,或只涉及 a 的查询,但不能用于其他组合。(在涉及 a 和 c 的查询中,规划器可以选择把索引用于 a,而把c 当作普通的未索引列。)当然,每个列都必须与适合该索引类型的操作符一起使用;涉及其他操作符的子句不会被考虑。

只有当涉及被索引列的子句是用 AND 连接时,才能使用多列索引。例如,

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

不能使用上面定义的索引 test2_mm_idx 来同时查找两个列。(不过,它可以用来只查找major 列。)

多列索引应该节制使用。大多数情况下,单个列上的索引就足够了,而且节省空间和时间。除非表的使用方式极端特定,超过三个列的索引不太可能有帮助。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.