8.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.h)。

查询优化器可以将多字段索引用于那些涉及索引中头 n 个连续字段的查询(在使用了合适的操作符的情况下),涉及的字段 最多可以到索引定义的字段数目.比如,一个定义在 (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 字段.)

我们应该节俭地使用多字段索引.在大多数时候,一个在单一的字段上 的索引就足够用了,并且它还可以节约时间和空间. 包含多于三个字段的索引几乎肯定是不正确的.