首先建立乙個簡單的表
建立乙個b,c,d的乙個聯合索引
注意點:
使用的表的結構為堆表形式,這也是oracle/db2/postgresql等資料庫採用的表組織形式,而不是innodb引擎所採用的聚簇索引表。
沒有包括t1表的主鍵索引
sql語句
例如,考慮以下的一條sql:
select
*from t1 where b >=
2and b <
8and c >
1and d !=
4and e != 『a』;
l 此sql,覆蓋索引idx_t1_bcd上的哪個範圍?
起始範圍:記錄[2,2,2]是第乙個需要檢查的索引項。索引起始查詢範圍由b >= 2,c > 1決定。2 在確定了查詢的起始、終止範圍之後,sql中還有哪些條件可以使用索引idx_t1_bcd過濾?終止範圍:記錄[8,8,8]是第乙個不需要檢查的記錄,而之前的記錄均需要判斷。索引的終止查詢範圍由b < 8決定;
根據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的提取。index last key針對上面的sql,應用這個提取規則,提取出來的index first key為(b >= 2, c > 1)。由於c的條件為》,提取結束,不包括d。
index last key的功能與index first key正好相反,用於確定索引查詢的終止範圍。提取規則:從索引的第乙個鍵值開始,檢查其在where條件中是否存在,若存在並且條件是=、<=,則將對應條件加入到indexlast key中,繼續提取索引的下乙個鍵值,使用同樣的提取規則;若存在並且條件是 < ,則將條件加入到index last key中,同時終止提取;若不存在,同樣終止index last key的提取。index filter針對上面的sql,應用這個提取規則,提取出來的index last key為(b < 8),由於是 < 符號,因此提取b之後結束。
在完成index3 table filterkey的提取之後,我們根據where條件固定了索引的查詢範圍,但是此範圍中的項,並不都是滿足查詢條件的項。在上面的sql用例中,(3,1,1),(6,4,4)均屬於範圍中,但是又均不滿足sql的查詢條件。
index filter的提取規則:同樣從索引列的第一列開始,檢查其在where條件中是否存在:若存在並且where條件僅為
=,則跳過第一列繼續檢查索引下一列,下一索引列採取與索引第一列同樣的提取規則;若where條件為 >=、>、=、>、 1 and d != 4 。
table filter是最簡單,最易懂,也是提取最為方便的。提取規則:所有不屬於索引列的查詢條件,均歸為table filter之中。同樣,針對上面的用例sql,table filter就為 e != 『a』。
索引原理及專案中如何使用索引例項分析
一.索引原理 為認識索引工作原理,首先有必要對資料表的基本結構作一次全面的複習。當乙個新錶被建立之時,系統將在磁碟中分配一段以8k為單位的連續空間,當字段的值從記憶體寫入磁碟時,就在這一既定空間隨機儲存,當乙個8k用完的時候,sqls指標會自動分配乙個8k的空間。這裡,每個8k空間被稱為乙個資料頁 ...
MySQL的索引結構原理分析
1.索引是什麼?索引是一種資料結構 索引是一種排好序的資料結構 2.索引的目的是什麼?幫助使用者高效快速查詢到業務所需的資料 綜上所訴,因此在大資料量的乙個表中,什麼樣的一種排好序的資料結構能夠達到我們的目的 1.特點 a 所有的葉子節點具有相同的深度,葉子節點的指標為空 b 所有的索引元素不重複 ...
Mysql索引底層原理分析
mysql索引底層原理分析,mysql索引的本質 mysql索引的底層原理 mysql索引的實戰經驗 面試問 資料庫中最常見的慢查詢優化方式是什麼?同學a 加索引。問 為什麼加索引能優化慢查詢?同學a 不知道同學b 因為索引其實就是一種優化查詢的資料結構,比如mysql中的索引是用b 樹實現的,而b...