B樹是一種多路自平衡搜索樹,它類似普通的二叉樹,但是B書允許每個節點有更多的子節點。B樹示意圖如下:
Paste_Image.png
B樹的特點:
(1)所有鍵值分布在整個樹中
(2)任何關鍵字出現且只出現在一個節點中
(3)搜索有可能在非葉子節點結束
(4)在關鍵字全集內做一次查找,性能逼近二分查找算法
B+樹是B樹的變體,也是一種多路平衡查找樹,B+樹的示意圖為:
Paste_Image.png
從圖中也可以看到,B+樹與B樹的不同在於:
(1)所有關鍵字存儲在葉子節點,非葉子節點不存儲真正的data
(2)為所有葉子節點增加了一個鏈指針
那么問題來了,為什么用B/B+樹這種結構來實現索引呢??
答:紅黑樹等結構也可以用來實現索引,但是文件系統及數據庫系統普遍使用B/B+樹結構來實現索引。mysql是基於磁盤的數據庫,索引是以索引文件的形式存在於磁盤中的,索引的查找過程就會涉及到磁盤IO(為什么涉及到磁盤IO請看文章后面的附加理解部分)消耗,磁盤IO的消耗相比較於內存IO的消耗要高好幾個數量級,所以索引的組織結構要設計得在查找關鍵字時要盡量減少磁盤IO的次數。為什么要使用B/B+樹,跟磁盤的存儲原理有關。
局部性原理與磁盤預讀
為了提升效率,要盡量減少磁盤IO的次數。實際過程中,磁盤並不是每次嚴格按需讀取,而是每次都會預讀。磁盤讀取完需要的數據后,會按順序再多讀一部分數據到內存中,這樣做的理論依據是計算機科學中注明的局部性原理:
鏈接:https://www.jianshu.com/p/0371c9569736
