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

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

不受支持的版本: 7.1
历史版本PostgreSQL 7.1 已于 2006 年 4 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

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

查询优化器可以把多列索引用于涉及索引中最先的 n 个连续列(当与合适的操作符一起使用时)的查询,最大可以达到索引定义中指定的总列数。例如,一个定义在(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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。