↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 8.0 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

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列。)

多列索引应谨慎使用。大多数情况下,单列索引已经足够,而且更省空间、也更省时间。除非表的使用方式极其程式化,否则超过三列的索引通常不会有帮助。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。