PostgreSQL索引
PostgreSQL提供了好幾種索引型別:B-tree, Hash, GiST, SP-GiST和GIN 。
B-tree索引也可以用來按照排序順序檢索資料。這並不總是比一個簡單的掃描和排序快, 但通常是有幫助的。
Hash 索引只能處理簡單的等於比較。當一個索引了的列涉及到使用= 運算子進行比較的時候,查詢規劃器會考慮使用 Hash 索引。
GiST 索引不是單獨一種索引型別,而是一種架構,可以在這種架構上實現很多不同的索引策略。 因此,可以使用 GiST 索引的運算子高度依賴於索引策略(運算子類)。 作為示例,PostgreSQL的標準釋出中包含用於二維幾何資料型別的 GiST 運算子類。
GiST索引也可最最佳化"nearest-neighbor"檢索,例如
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子句, 那麼還會有一個額外的排序步驟。因為這個原因,以及每個額外的索引掃描都增加了額外的時間, 規劃器有時候會選擇使用簡單的索引掃描,即使有多個索引可用也如此。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL索引頁SQL索引
- PostgreSQL的常用索引SQL索引
- PostgreSQL RDS索引陷阱 - nanitSQL索引NaN
- postgresql怎麼建立索引SQL索引
- 【INDEX】Postgresql索引介紹IndexSQL索引
- PostgreSQL的B-tree索引SQL索引
- PostgreSQL學習手冊(索引)SQL索引
- 《PostgreSQL》 索引與最佳化SQL索引
- postgreSQL 索引(二)型別介紹SQL索引型別
- PostgreSQL中的索引介紹-GiSTSQL索引
- PostgreSQL中索引與CTE簡介SQL索引
- 【Postgresql】索引型別(btree、hash、GIST、GIN)SQL索引型別
- PostgreSQL10GIN索引鎖優化SQL索引優化
- PostgreSQL叢集方案相關索引頁SQL索引
- PostgreSQL11preview-索引增強彙總SQLView索引
- PostgreSQL技術內幕(七)索引掃描SQL索引
- 資料型別與函式索引-PostgreSQL篇資料型別函式索引SQL
- PostgreSQL11preview-索引優化。filter智慧消除、分割槽索引智慧合併SQLView索引優化Filter
- Oracle vs PostgreSQL,研發注意事項(12) - NULL與索引OracleSQLNull索引
- PostgreSQL-亂序插入資料導致索引膨脹SQL索引
- PostgreSQL10.0preview效能增強-間接索引(secondaryindex)SQLView索引Index
- PostgreSQL11preview-BRIN索引介面功能擴充套件(BLOOMFILTER、minmax分段)SQLView索引套件OOMFilter
- PostgreSQL Page頁結構解析(5)- B-Tree索引儲存結構#1SQL索引
- PostgreSQL Page頁結構解析(6)- B-Tree索引儲存結構#2SQL索引
- PostgreSQL Page頁結構解析(7)- B-Tree索引儲存結構#3SQL索引
- PostgreSQL如何確定某個opclass支援哪些操作符(支援索引),JOIN方法,排序SQL索引排序
- PostgreSQL資料庫多列複合索引的欄位順序選擇原理SQL資料庫索引
- PostgreSQL10.0preview功能增強-兩段式索引(約束欄位+附加欄位)SQLView索引
- 本地索引、全域性索引、字首索引、非字首索引索引
- PostgreSQL DBA(45) - Hypothetical Indexes in PostgreSQLSQLIndex
- PostgreSQL:WITHSQL
- PostgreSQLSQL
- 第二週-20200306-PostgreSQL13並行vacuum索引SQL並行索引
- 【讀書筆記】《PostgreSQL指南-內幕探索》-7.堆內元組和僅索引掃描筆記SQL索引
- PostgreSQL10.0preview功能增強-OLAP增強向量聚集索引(列儲存擴充套件)SQLView索引套件
- HTAP資料庫PostgreSQL場景與效能測試之21-(OLTP+OLAP)排序、建索引資料庫SQL排序索引
- PostgreSQL-PostgreSQL中的public(九)SQL
- 主鍵索引 (聚集索引) 和普通索引 (輔助索引) 的區別索引