PostgreSQL 提供了幾種索引類型:B-tree、Hash、GiST、SP-GiST、GIN、BRIN,以及擴充功能 bloom。 每種索引類型使用不同的演算法,該演算法最適合不同類型的可索引子句。 預設情況下,CREATE INDEX
指令會建立 B-tree 索引,這適合最常見的情況。 其他索引類型是透過撰寫關鍵字 USING
後面接著索引類型名稱來選取的。 例如,要建立 Hash 索引
CREATE INDEXname
ONtable
USING HASH (column
);
B-tree 可以處理可以排序成某種順序的資料上的相等性和範圍查詢。 特別是,每當索引欄位涉及使用以下運算子之一進行比較時,PostgreSQL 查詢規劃器將考慮使用 B-tree 索引
< <= = >= >
與這些運算子組合等效的構造(例如 BETWEEN
和 IN
)也可以使用 B-tree 索引搜尋來實現。 此外,索引欄位上的 IS NULL
或 IS NOT NULL
條件可以與 B-tree 索引一起使用。
最佳化器也可以將 B-tree 索引用於涉及模式比對運算子 LIKE
和 ~
的查詢 如果 模式是常數且錨定到字串的開頭 - 例如,col LIKE 'foo%'
或 col ~ '^foo'
,但不是 col LIKE '%bar'
。 但是,如果您的資料庫未使用 C 地區設定,則需要使用特殊的運算子類別建立索引,以支援模式比對查詢的索引;請參閱下面的第 11.10 節。 也可以使用 B-tree 索引來實現 ILIKE
和 ~*
,但前提是模式以非字母字元開頭,即不受大小寫轉換影響的字元。
B-tree 索引也可以用於以排序順序檢索資料。 這並不總是比簡單的掃描和排序更快,但通常很有用。
Hash 索引儲存從索引欄位的值派生的 32 位元雜湊碼。 因此,此類索引只能處理簡單的相等性比較。 每當索引欄位涉及使用等於運算子進行比較時,查詢規劃器將考慮使用雜湊索引
=
GiST 索引不是單一種類的索引,而是一個基礎結構,可以在其中實作許多不同的索引策略。 因此,可以使用 GiST 索引的特定運算子會根據索引策略(運算子類別)而有所不同。 例如,PostgreSQL 的標準發行版包含幾個二維幾何資料類型的 GiST 運算子類別,這些類別支援使用這些運算子進行索引查詢
<< &< &> >> <<| &<| |&> |>> @> <@ ~= &&
(請參閱 第 9.11 節,了解這些運算子的含義。)標準發行版中包含的 GiST 運算子類別記錄在 表 64.1 中。 許多其他 GiST 運算子類別可在 contrib
集合中或作為單獨的專案提供。 如需更多資訊,請參閱 第 64.2 節。
GiST 索引也能够最佳化 “最近鄰” 搜尋,例如
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
找到最靠近給定目標點的十個位置。 這樣做的能力再次取決於所使用的特定運算子類別。 在 表 64.1 中,可以這種方式使用的運算子列在 “排序運算子” 欄中。
與 GiST 索引類似,SP-GiST 索引提供了一個基礎結構,支援各種搜尋。 SP-GiST 允許實作各種不同的非平衡基於磁碟的資料結構,例如四元樹、k-d 樹和基數樹(嘗試)。 例如,PostgreSQL 的標準發行版包含二維點的 SP-GiST 運算子類別,這些類別支援使用這些運算子進行索引查詢
<< >> ~= <@ <<| |>>
(請參閱 第 9.11 節,了解這些運算子的含義。)標準發行版中包含的 SP-GiST 運算子類別記錄在 表 64.2 中。 如需更多資訊,請參閱 第 64.3 節。
如同 GiST,SP-GiST 支援“最近鄰”搜尋。對於支援距離排序的 SP-GiST 運算子類別,對應的運算子會列在“排序運算子”欄位中,請參考表 64.2。
GIN 索引是“反向索引”,適用於包含多個組成值 (component values) 的資料值,例如陣列。反向索引包含每個組成值的個別條目 (entry),並且可以有效地處理測試特定組成值是否存在的查詢。
如同 GiST 和 SP-GiST,GIN 可以支援許多不同的使用者定義索引策略,而 GIN 索引可以使用的特定運算子取決於索引策略。舉例來說,PostgreSQL 的標準發行版本包含用於陣列的 GIN 運算子類別,該類別支援使用以下運算子的索引查詢:
<@ @> = &&
(關於這些運算子的意義,請參考第 9.19 節)。標準發行版本中包含的 GIN 運算子類別記錄在表 64.3中。許多其他的 GIN 運算子類別可在 contrib
集合中或以獨立專案的形式取得。更多資訊請參考第 64.4 節。
BRIN 索引 (Block Range INdexes 的簡稱) 儲存關於儲存在資料表連續實體區塊範圍中的值的摘要 (summaries)。因此,對於其值與資料表列的實體順序良好相關的欄位,它們是最有效的。如同 GiST、SP-GiST 和 GIN,BRIN 可以支援許多不同的索引策略,而 BRIN 索引可以使用的特定運算子取決於索引策略。對於具有線性排序順序的資料類型,索引資料對應於每個區塊範圍中欄位值的最小值和最大值。這支援使用以下運算子的索引查詢:
< <= = >= >
如果您在文件中發現任何不正確、與您特定功能的使用經驗不符,或需要進一步澄清之處,請使用此表格回報文件問題。