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 字串。)

我們應該節儉地使用多字串索引。在大多數時候,一個在單一的字串上 的索引就足夠用了,並且它還可以節約時間和空間。 除非以非常特定的方式使用,否則包含多於三個字串的索引幾乎沒什麼用。