pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
索引可以定义在多个列上。例如,如果你有一个这样形式的表:
CREATE TABLE test2 ( major int, minor int, name varchar );
(比如说,你把你的 /dev 目录保存在数据库里……)而且你经常做这样的查询
SELECT name FROM test2 WHERE major =constantAND minor =constant;
那么在 major 和minor 列上一起定义一个索引可能是合适的,例如
CREATE INDEX test2_mm_idx ON test2 (major, minor);
当前,只有 B-树和 GiST 实现支持多列索引。最多可以指定 32 个列。(在构建 PostgreSQL 时可以改变这个限制;参见文件 pg_config.h。)
查询优化器可以把多列索引用于涉及索引中最先的 n 个连续列(当与合适的操作符一起使用时)的查询,最大可以达到索引定义中指定的总列数。例如,一个定义在(a, b, c) 上的索引可以用于涉及a、b、c 全部的查询,或涉及 a 和 b 两者的查询,或只涉及 a 的查询,但不能用于其他组合。(在涉及 a 和 c 的查询中,规划器可以选择把索引用于 a,而把c 当作普通的未索引列。)
只有当涉及被索引列的子句是用 AND 连接时,才能使用多列索引。例如,
SELECT name FROM test2 WHERE major =constantOR minor =constant;
不能使用上面定义的索引 test2_mm_idx 来同时查找两个列。(不过,它可以用来只查找major 列。)
多列索引应该节制使用。大多数情况下,单个列上的索引就足够了,而且节省空间和时间。超过三个列的索引几乎肯定是不合适的。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。