為什么MySQL數據庫要用B+樹存儲索引?


問題:MySQL中存儲索引用到的數據結構是B+樹,B+樹的查詢時間跟樹的高度有關,是log(n),如果用hash存儲,那么查詢時間是O(1)。既然hash比B+樹更快,為什么mysql用B+樹來存儲索引呢?

答:一、從內存角度上說,數據庫中的索引一般時在磁盤上,數據量大的情況可能無法一次性裝入內存,B+樹的設計可以允許數據分批加載。

二、從業務場景上說,如果只選擇一個數據那確實是hash更快,但是數據庫中經常會選中多條這時候由於B+樹索引有序,並且又有鏈表相連,它的查詢效率比hash就快很多了。

 

問題:為什么不用紅黑樹或者二叉排序樹?

答:樹的查詢時間跟樹的高度有關,B+樹是一棵多路搜索樹可以降低樹的高度,提高查找效率

 

問題:既然增加樹的路數可以降低樹的高度,那么無限增加樹的路數是不是可以有最優的查找效率?

答:這樣會形成一個有序數組,文件系統和數據庫的索引都是存在硬盤上的,並且如果數據量大的話,不一定能一次性加載到內存中。有序數組沒法一次性加載進內存,這時候B+樹的多路存儲威力就出來了,可以每次加載B+樹的一個結點,然后一步步往下找,

 

問題:在內存中,紅黑樹比B樹更優,但是涉及到磁盤操作B樹就更優了,那么你能講講B+樹嗎?

B+樹是在B樹的基礎上進行改造,它的數據都在葉子結點,同時葉子結點之間還加了指針形成鏈表。

下面是一個4路B+樹,它的數據都在葉子結點,並且有鏈表相連。

問題:為什么B+樹要這樣設計?

答:這個跟它的使用場景有關,B+樹在數據庫的索引中用得比較多,數據庫中select數據,不一定只選一條,很多時候會選中多條,比如按照id進行排序后選100條。如果是多條的話,B+樹需要做局部的中序遍歷,可能要跨層訪問。而B+樹由於所有數據都在葉子結點不用跨層,同時由於有鏈表結構,只需要找到首尾,通過鏈表就能把所有數據取出來了。

 比如選出7到19只需要在葉子結點中就能找到。

 

 


免責聲明!

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



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