MySQL的B+樹索引底層構成


(閱讀需要對InnoDB索引頁的結構和原理有基本了解,圖片來源《MySQL是怎樣運行的》)

InnoDB的主鍵B+樹索引結構

  

 簡單解釋  

  (1)可以看到,InnoDB的B+樹索引的結點就是InnoDB的數據頁,這些結點通過File Header中的上一頁、下一頁左右相連成為一個雙向鏈表;

  (2)B+樹只有葉子結點才存放數據,非葉子結點的記錄頭的record_type字段都置為1,葉子節點的記錄的record_type字段則是0(除了系統插入的最大記錄、最小記錄);

  (3)非葉子結點的只有兩個字段有效:頁號+該頁號的頁內記錄的最小主鍵id(注意圖中紅字部分)。這樣根據要查的目標記錄的id就可以找到它屬於哪個頁了,然后在頁內根據要查的記錄主鍵二分找到最相近的槽號,通過槽號找到記錄組后就只有個位的記錄條數了,直接遍歷即可。

  (4)二級索引或叫輔助索引也是類似的結構,只是把按照主鍵尋找改成按照索引字段+主鍵尋找結點而已(加主鍵不僅是為了回訪主鍵索引,也是為了保證非葉子結點中記錄的唯一性,索引字段可能 重復)。 二級索引的葉子結點不記錄所有數據,只有索引字段和主鍵,確定查找目標后需要拿主鍵回訪主鍵索引。

  (5)為(c1,c2)建立聯合索引,也就是二級索引,這時索引記錄里就會存放下一層結點的頁號和該頁里c1的最小值、c2的最小值。優先按照建立索引時的左邊字段進行排序,即c1,當c1字段相同時,在這些c1相同的子鏈里再根據c2字段進行索引。這也是左前綴原則的原理。

 

B樹和B+樹的不同點及思考

  (1)我們知道從磁盤搬運數據到內存一般都是幾KB的搬,避免頻繁磁盤IO。所以InnoDB選擇一個頁作為一個結點,一次性運一個結點進內存,然后在內存中二分查找、遍歷找到對應記錄。B樹的每個結點 里的每條記錄都是帶有完整的一行數據的,這就導致了一個結點中可存儲的記錄條數變少了,就意味着一個結點開的叉變少了很多,就意味着整個索引樹的高度變大了,這顯然是不好的。基於此,B+樹讓全部數據存到葉子結點中,其他結點不存放數據,每個非葉子結點的分叉大大增多,代價就是每次查找都必須走到葉子結點。4層B+樹已經可以存很多很多記錄了,5到6層已經是極限了。

  (2)B+樹的所以數據都存到葉子結點,還有雙向的指針將這些結點組成雙向鏈表,非常適合范圍查找。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM