11.3. 多字段索引

一个索引可以定义在多于一个字段上。比如,如果年有象下面这样的表∶

CREATE TABLE test2 (
  major int,
  minor int,
  name varchar
);

(比如,把你的 /dev 目录保存在一个数据库里。。。)并且你经常做下面这样的查询

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

那么也许我们在字段 majorminor 上一起定义一个索引是比较合适的做法,也就是∶

CREATE INDEX test2_mm_idx ON test2 (major, minor);

目前,只有 B-tree 和 GiST 实现支持多字段索引。 缺省最多可以声明 32 个字段(这个限制可以在制作 PostgreSQL时改变, 见文件 pg_config_manual.h)。

查询规划器可以将多字段索引用于那些涉及索引定义中最左边的字段, 以及在其右边列出任意数目的无空隙字段的查询(在使用了合适的操作符的情况下), 涉及的字段最多可以到索引定义的字段数目。比如,一个定义在 (a, b, c) 上的索引可以用于所有涉及 ab,和 c 全部的查询,或者那些同时包含 ab 的查询,或者那些只包括 a,不包括其它的查询。 (在一个只涉及 ac 的查询里,规划器可能会只使用用于 a 的索引, 而把 c 当做一个普通的没有索引的字段看待。) 当然,每个字段必须是在那些适用于该索引类型的操作符里使用; 那些涉及其它操作符的子句将不会被考虑。

只有在涉及索引字段的子句是用 AND 连接的时候才会使用多字段索引。比如,

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

无法利用我们上面定义的 test2_mm_idx 来查找两个字段。(不过,你可以用它查找 major 字段。)

我们应该节俭地使用多字段索引。在大多数时候,一个在单一的字段上 的索引就足够用了,并且它还可以节约时间和空间。 除非以非常特定的方式使用,否则包含多于三个字段的索引几乎没什么用。