在什麼是索引這篇文章中介紹了索引的常見的資料結構,其對應資料結構的圖是以主鍵索引來講解的。本文我們一起看下聯合使用在b+樹的結構是怎麼樣的?
對多個字段同時建立的索引(有順序,abc,cba是完全不同的兩種聯合索引);
假設聯合索引為age,name,school組合的
其在b+樹的結構如下:
聯合索引的葉子節點中data資料儲存的是主鍵id;如果要查詢語句中查詢的是表中所有的資料,則先通過聯合索引樹找到主鍵id,然後再根據主鍵索引樹找到對應data資料;
聯合索引中乙個節點中會按照索引從左到右的索引構建乙個節點,這樣也就可以和sql優化中常說的最左字首匹配原則進行關聯;
最左字首匹配原則和聯合索引的索引樹結構和檢索方式是有關的。在上面聯合索引樹,最底層的葉子節點先按照age從左右到右遞增排列,name和school列無序的;當age列相同時,相同的節點中會按照name從左到右遞增排列,school無序的;當name列相同時,則就按照school從左到右遞增排列;
所以我們在寫查詢語句的時候,一般最好按照索引的最左字首匹配原則編寫sql;
如stu表中有索引(age,name,school),查詢語句如下:
select
*from stu where age =
23and name =
'e'and school =
'交大'
;
這條sql語句會走索引樹進行檢索,會使用到age,name,school這個字段組合的索引;
select * from stu where age =
23 and school =
'交大'
;
這條sql語句也會走索引樹進行檢索,但是只會使用到age欄位,mysql在檢索b+樹時,先檢索age,找打值為23的節點,但是name欄位無法走索引檢索,school欄位則也沒有使用到;從而只使用age欄位,將age等於23的資料都取出在乙個個和school字段值進行對比,篩選需要的資料。
上面說到聯合索引葉子節點中的data儲存的是主鍵id,當sql語句使用到聯合索引是按照索引樹檢索找到符合條件的葉子節點中data的主鍵id,然後根據主鍵id去檢索主鍵索引樹,找到對應的全部資料;那如果我們在查詢的時候不需要將所有的資料都返回,我們就可以使用到覆蓋索引;
覆蓋索引是一種很常用的優化手段。因為在使用輔助索引檢索時候,我們只能拿到葉子節點中data資料即主鍵,相當於獲取資料還需要再根據主鍵查詢主鍵索引樹再獲取到資料。當我們查詢的字段是聯合索引(輔助索引)中的字段,則不需要進行回表,直接從索引樹上進行返回就可以啦;
select age,name,school from stu where age =
23and name =
'e'and school =
'交大'
;
這條sql語句執行的時候就直接在聯合索引樹中直接取出符合條件的資料,無需通過回表。 聯合索引在B 樹上的結構
前言 最近在學習mysql的儲存引擎和索引的知識。看了許多篇介紹myisam和innodb的索引的例子,都能理解。像這張索引圖 ps 該圖來自大神張洋的 mysql索引背後的資料結構及演算法原理 一文。但許多文章講述的都是單列索引,我很好奇聯合索引對應的結構圖是怎樣的。疑惑 聯合索引的結構是怎樣的 ...
聯合索引在B 樹上的結構
一級索引 二級聯合索引 假設這是乙個多列索引 col1,col2,col3 對於葉子節點,是這樣的 ps 該圖改自 mysql索引背後的資料結構及演算法原理 一文的配圖。也就是說,聯合索引 col1,col2,col3 也是一棵b tree,其非葉子節點儲存的是第乙個關鍵字的索引,而葉節點儲存的則是...
聯合索引在B 樹上的結構介紹
最近在學習mysql的儲存引擎和索引的知識。看了許多篇介紹myisam和innodb的索引的例子,都能理解。像這張索引圖 ps 該圖來自大神張洋的 mysql索引背後的資料結構及演算法原理 一文。但許多文章講述的都是單列索引,我很好奇聯合索引對應的結構圖是怎樣的。比方說聯合索引 col1,col2,...