【面試現場】爲何MySQL數據庫要用B+樹存儲索引?html
hash索引o(1) B+樹索引 o(logn)面試
爲何紅黑樹出現了,由於防止某些狀況下二叉排序樹退化爲鏈表——誕生了二叉排序平衡樹——樹的性能取決於樹的高度數據庫
爲何DB要用M路B樹,爲了再下降樹的高度,減小db 磁盤io 次數,若是在內存中,紅黑樹效率更高數組
爲何M不能無限大,由於會退化成有序數組,沒法一次載入內存,B樹則能夠一次加載一個節點性能
B+樹在B樹的基礎上,(1)僅在葉子節點存放數據——B樹高度更大;(2)同時葉子節點鏈表——避免跨層範圍查找spa
爲何不用hash索引:設計
(1)select範圍3d
(2) 不能排序指針
(3)索引通常是在磁盤上,數據量大的狀況可能沒法一次裝入內存,分批的話比B+樹io次數多的多,B+樹的設計能夠容許數據分批加載,同時樹的高度較低,磁盤io次數少,提升查找效率orm
(4)hash衝突退化爲遍歷
還有一篇文章,
https://www.cnblogs.com/sujing/p/11110292.html
一、B-Tree由於非葉子結點也保存具體數據,因此在查找某個關鍵字的時候找到便可返回。而B+Tree全部的數據都在葉子結點,每次查找都獲得葉子結點。因此在一樣高度的B-Tree和B+Tree中,B-Tree查找某個關鍵字的效率更高。
二、因爲B+Tree全部的數據都在葉子結點,而且結點之間有指針鏈接,在找大於某個關鍵字或者小於某個關鍵字的數據的時候,B+Tree只須要找到該關鍵字而後沿着鏈表遍歷就能夠了,而B-Tree還須要遍歷該關鍵字結點的根結點去搜索。
三、因爲B-Tree的每一個結點(這裏的結點能夠理解爲一個數據頁)都存儲主鍵+實際數據,而B+Tree非葉子結點只存儲關鍵字信息,而每一個頁的大小有限是有限的,因此同一頁能存儲的B-Tree的數據會比B+Tree存儲的更少。這樣一樣總量的數據,B-Tree的深度會更大,增大查詢時的磁盤I/O次數,進而影響查詢效率(針對聚簇索引主鍵索引)。