11.2. 索引類型

PostgreSQL 提供了好幾種索引類型︰ B-tree,R-tree,GiST 和散列.每種索引類型都比較適合某些特定的查詢類型, 因為它們用了不同的算法. 缺省時, CREATE INDEX 命令將創建一個 B-tree 索引,這種索引適合于大多數常見的情形。 B-tree 可以處理那些可以按照某種順序存儲的數據的等于和範圍查詢。 特別是在一個建立了索引的列涉及到使用下列操作符之一進行比較的時候, PostgreSQL 的查詢規劃器都會考慮使用 B-tree 索引︰ <, <=, =, >=, >

優化器也會把 B-tree 所以用于涉及模式匹配操作符 LIKEILIKE~,和 ~* 的查詢,條件是模式錨接在字串的開頭,比如, col LIKE 'foo%' 或者 col ~ '^foo', 而不是 col LIKE '%bar'。 但是,如果你的服務器不適用 C 區域,那麼你需要用一個特殊的操作符表創建索引。 參閱下面的 Section 11.6

R-tree 索引特別適合于空間數據.要創建一個 R-tree 索引, 使用下面形式的命令

CREATE INDEX name ON table USING RTREE (column);

當一個索引了的列涉及到使用下列操作符之一進行比較的時候, PostgreSQL 的查詢規劃器都會考慮使用 R-tree 索引︰ <<, &<, &>, >>, @, ~=, && (請參考 Section 9.9 獲取這些操作符的含義.)

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

CREATE INDEX name ON table USING HASH (column);

注意: 測試表明 PostgreSQL 的散列索引和 B-tree 索引類似或者慢一些, 而且散列索引的尺寸和制作時間要差很多。而且在高度並發的條件下,散列 索引的性能也很差。因此,目前我們不建議使用散列索引。

B-tree 索引是一個 Lehman-Yao 高並發 B-tree 的實 現。R-tree 索引用 Guttman 的二次分割算法實現了標準的 R-tree。 hash(散列)索引是 Litwin 的線性散列的一個實現。 我們單獨的列出這些所用的算法是要表明所有這些索引方法都是完全動態的並且不必進行週期性的優化 (例如,象靜態散列算法常見的那樣)。