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_manual.h。)
查询规划器可以使用多列索引来处理这样的查询:涉及索引定义中最左边的列,加上它右边任意数量、中间没有间隔的列。例如,一个定义在(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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。