2.1索引的使用原理分析
索引的使用原理分析
基本說明
首先建立一個簡單的表
建立一個b,c,d的一個聯合索引
注意點:
- 使用的表的結構為堆表形式,這也是Oracle/DB2/PostgreSQL等資料庫採用的表組織形式,而不是InnoDB引擎所採用的聚簇索引表。
- 沒有包括t1表的主鍵索引
原理說明
sql語句
例如,考慮以下的一條SQL:
select * from t1 where b >= 2 and b < 8 and c > 1 and d != 4 and e != ‘a’;
l 此SQL,覆蓋索引idx_t1_bcd上的哪個範圍?
起始範圍:記錄[2,2,2]是第一個需要檢查的索引項。索引起始查詢範圍由b >= 2,c > 1決定。
終止範圍:記錄[8,8,8]是第一個不需要檢查的記錄,而之前的記錄均需要判斷。索引的終止查詢範圍由b < 8決定;
2 在確定了查詢的起始、終止範圍之後,SQL中還有哪些條件可以使用索引idx_t1_bcd過濾?
根據SQL,固定了索引的查詢範圍[(2,2,2),(8,8,8))之後,此索引範圍中並不是每條記錄都是滿足where查詢條件的。例如:(3,1,1)不滿足c>1的約束;(6,4,4)不滿足d != 4的約束。而c,d列,均可在索引idx_t1_bcd中過濾掉不滿足條件的索引記錄的。 因此,SQL中還可以使用c > 1 and d != 4條件進行索引記錄的過濾。
3 在確定了索引中最終能夠過濾掉的條件之後,還有哪些條件是索引無法過濾的?
此問題的答案顯而易見,e != ‘a’這個查詢條件,無法在索引idx_t1_bcd上進行過濾,因為索引並未包含e列。e列只在堆表上存在,為了過濾此查詢條件,必須將已經滿足索引查詢條件的記錄回表,取出表中的e列,然後使用e列的查詢條件e!= ‘a’進行最終的過濾。
條件分組
所有SQL的where條件,均可歸納為3大類:Index Key (First Key & Last Key),Index Filter,Table Filter。
l Index Key
用於確定SQL查詢在索引中的連續範圍(起始範圍+結束範圍)的查詢條件,被稱之為Index Key。由於一個範圍,至少包含一個起始與一個終止,因此Index Key也被拆分為Index First Key和Index Last Key,分別用於定位索引查詢的起始,以及索引查詢的終止條件。
Index First Key
用於確定索引查詢的起始範圍。提取規則:從索引的第一個鍵值開始,檢查其在where條件中是否存在,若存在並且條件是=、>=,則將對應的條件加入Index First Key之中,繼續讀取索引的下一個鍵值,使用同樣的提取規則;若存在並且條件是>,則將對應的條件加入Index FirstKey中,同時終止Index First Key的提取;若不存在,同樣終止Index First Key的提取。
針對上面的SQL,應用這個提取規則,提取出來的Index First Key為(b >= 2, c > 1)。由於c的條件為>,提取結束,不包括d。
Index Last Key
Index Last Key的功能與Index First Key正好相反,用於確定索引查詢的終止範圍。提取規則:從索引的第一個鍵值開始,檢查其在where條件中是否存在,若存在並且條件是=、<=,則將對應條件加入到IndexLast Key中,繼續提取索引的下一個鍵值,使用同樣的提取規則;若存在並且條件是 < ,則將條件加入到Index Last Key中,同時終止提取;若不存在,同樣終止Index Last Key的提取。
針對上面的SQL,應用這個提取規則,提取出來的Index Last Key為(b < 8),由於是 < 符號,因此提取b之後結束。
Index Filter
在完成Index
Key的提取之後,我們根據where條件固定了索引的查詢範圍,但是此範圍中的項,並不都是滿足查詢條件的項。在上面的SQL用例中,(3,1,1),(6,4,4)均屬於範圍中,但是又均不滿足SQL的查詢條件。Index Filter的提取規則:同樣從索引列的第一列開始,檢查其在where條件中是否存在:若存在並且where條件僅為
=,則跳過第一列繼續檢查索引下一列,下一索引列採取與索引第一列同樣的提取規則;若where條件為 >=、>、<、<= 其中的幾種,則跳過索引第一列,將其餘where條件中索引相關列全部加入到Index Filter之中;若索引第一列的where條件包含> =、>=、>、<、<= 之外的條件,則將此條件以及其餘where條件中索引相關列全部加入到Index Filter之中;若第一列不包含查詢條件,則將所有索引相關條件均加入到Index Filter之中。 針對上面的用例SQL,索引第一列只包含>=、< 兩個條件,因此第一列可跳過,將餘下的c、d兩列加入到Index Filter中。因此獲得的Index Filter為 c > 1 and d != 4 。
3 Table Filter
Table Filter是最簡單,最易懂,也是提取最為方便的。提取規則:所有不屬於索引列的查詢條件,均歸為Table Filter之中。
同樣,針對上面的用例SQL,Table Filter就為 e != ‘a’。