PostgreSQL索引

fiona8953發表於2016-07-28
PostgreSQL提供了好幾種索引型別:B-tree, Hash, GiST, SP-GiST和GIN 。
B-tree索引也可以用來按照排序順序檢索資料。這並不總是比一個簡單的掃描和排序快, 但通常是有幫助的。
Hash 索引只能處理簡單的等於比較。當一個索引了的列涉及到使用= 運算子進行比較的時候,查詢規劃器會考慮使用 Hash 索引。
GiST 索引不是單獨一種索引型別,而是一種架構,可以在這種架構上實現很多不同的索引策略。 因此,可以使用 GiST 索引的運算子高度依賴於索引策略(運算子類)。 作為示例,PostgreSQL的標準釋出中包含用於二維幾何資料型別的 GiST 運算子類。
GiST索引也可最最佳化"nearest-neighbor"檢索,例如
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;

找出距離給出目標點最近的十個地點。能這樣做也是依賴於使用特定的運算子類。

SP-GiST索引類似於GiST索引,提供一個支援不同型別檢索的架構。 SP-GiST允許實現許多各種不同的非平衡的基於磁碟的資料結構,例如四叉樹,k-d樹和基數樹(字典樹)。 作為示例,PostgreSQL的標準釋出中包含用於二維點的SP-GiST運算子類。
GIN 索引是反轉索引,它可以處理包含多個鍵的值(比如陣列)。與 GiST和SP-GiST 類似, GIN 支援使用者定義的索引策略,可以使用 GIN 索引的運算子根據索引策略的不同而不同。 作為示例,PostgreSQL的標準釋出中包含用於一維陣列的 GIN 運算子類。

一個單獨的索引掃描只能用於這樣的條件子句:使用被索引欄位和索引運算子類中的運算子, 並且這些條件以AND連線。
PostgreSQL能夠組合多個索引(包括同一索引的多次使用) 來處理單個索引掃描不能實現的情況。系統可以在多個索引掃描之間組成AND 和OR條件。比如,一個類似WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 這樣的查詢可以分解成四個在x上的獨立掃描,每個掃描使用一個條件, 最後將這些掃描的結果 OR 在一起,生成最終結果。另外一個例子是,如果我們在x 和y上有獨立的索引,一個類似WHERE x = 5 AND y = 6 這樣的查詢可以分解為幾個使用獨立索引的子句,然後把這幾個結果 AND 在一起,生成最終結果。

為了組合多個索引,系統掃描每個需要的索引,然後在記憶體裡組織一個點陣圖, 它給出索引掃描報告符合索引條件的表資料行的位置。然後,根據查詢的需要, 把這個點陣圖使用 AND 和 OR 合併在一起。最後,訪問實際的表檢索並返回資料行。 表的資料行是按照物理順序進行訪問的,因為那就是點陣圖的佈局; 這就意味著任何原來的索引排序都將消失,而如果查詢有一個ORDER BY子句, 那麼還會有一個額外的排序步驟。因為這個原因,以及每個額外的索引掃描都增加了額外的時間, 規劃器有時候會選擇使用簡單的索引掃描,即使有多個索引可用也如此。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26477398/viewspace-2122683/,如需轉載,請註明出處,否則將追究法律責任。

相關文章