1. 程式人生 > >PostgreSQL索引的4種類型

PostgreSQL索引的4種類型

PostgreSQL 提供了好幾種索引型別:B-tree, Hash, GiST, GIN 。每種索引型別都比較適合某些特定的查詢型別,因為它們用了不同的演算法。預設時,CREATE INDEX 命令將建立一個 B-tree 索引,它適合大多數情況。

B-tree 適合處理那些能夠按順序儲存的資料之上的等於和範圍查詢。特別是在一個建立了索引的欄位涉及到使用

<
<=
=
>=
>
操作符之一進行比較的時候,PostgreSQL 的查詢規劃器都會考慮使用 B-tree 索引。等效於這些操作符組合的構造,比如 BETWEEN 和 IN ,也可以用搜索 B-tree 索引實現。但是要注意,
IS NULL 不同於 = 並且是不能建立索引的。

僅當模式是一個常量,並且錨定在 字串開頭的時候,優化器才會把 B-tree 索引用於模式匹配操作符 LIKE 和 ~ ,比如:col LIKE 'foo%' 或 col ~ '^foo' ,但是 col LIKE '%bar' 就不行。同時,如果你的伺服器未使用 C 區域設定,那麼你需要用一個特殊的操作符類建立索引來支援模式匹配查詢上的索引。 還有可能將 B-tree 索引用於 ILIKE 和 ~* ,但是僅當模式以非字母字元(不受大小寫影響的字元)開頭才可以。

Hash 索引只能處理簡單的等於比較。當一個索引了的列涉及到使用 = 操作符進行比較的時候,查詢規劃器會考慮使用 Hash 索引。下面的命令用於建立 Hash 索引:

CREATE INDEX name ON table USING hash (column);

【注意】測試表明,PostgreSQL 的 Hash 索引的效能不比 B-tree 索引強,而 Hash 索引的尺寸和製作時間更差。另外,Hash 索引操作目前沒有記錄 WAL 日誌,因此如果發生了資料庫崩潰,我們可能需要用 REINDEX 重建 Hash 索引。因為這些原因,我們並不鼓勵使用 Hash 索引。

GiST 索引不是單獨一種索引型別,而是一種架構,可以在這種架構上實現很多不同的索引策略。因此,可以使用 GiST 索引的特定操作符型別高度依賴於索引策略(操作符類)。作為示例,PostgreSQL 的標準釋出中包含用於二維幾何資料型別的 GiST 操作符類,它支援

<<
&<
&>
>>
<<|
&<|
|&>
|>>
@>
<@
~=
&&
操作符的索引查詢。這些操作符的含義參見。 許多其它 GiST 操作符類位於 contrib 中,或者是單獨的專案,更多資訊參見。

GIN 索引是反轉索引,它可以處理包含多個鍵的值(比如陣列)。與 GiST 類似,GIN 支援使用者定義的索引策略,可以使用 GIN 索引的特定操作符型別根據索引策略的不同而不同。作為示例,PostgreSQL 的標準釋出中包含用於一維陣列的 GIN 操作符類,它支援

<@
@>
=
&&
操作符的索引查詢。這些操作符的含義參見。 許多其它 GIN 操作符類位於 contribtsearch2intarray 模組。