Today is the first day of the rest of your life.
今天是你餘下人生的第一天。
金三銀四,求職者愈來愈活躍,面試官問問題角度愈來愈刁鑽。一言不合就問底層實現。你們都知道MySQL索引的實現用到了B+樹,本文主要是分享了對B+樹的一點我的理解。面試
衆所周知,查找效率比較高的數據結構有不少,呢爲何要用B+樹呢?先簡單分析一下查詢效率比較高的幾種數據結構。redis
散列表的查詢性能很好,時間複雜度是 O(1)。可是,散列表不能支持按照區間快速查找數據。算法
跳錶是在鏈表之上加上多層索引構成的。它支持快速地插入、查找、刪除數據,時間複雜度是 O(logn)。而且,跳錶也支持按照區間快速地查找數據。只須要定位到區間起點值對應在鏈表中的結點,而後從這個結點開始,順序遍歷鏈表,直到區間終點對應的結點爲止,這期間遍歷獲得的數據就是知足區間值的數據。mongodb
ps:redis的有序集合就是跳錶+散列表構建的
看着好像跳錶也能夠知足索引的要求。可能由於先有B+樹後有的跳錶,因此才選的B+?數據庫
平衡二叉查找樹查詢的性能高,時間複雜度是 O(logn)。並且,對樹進行中序遍歷,能夠獲得一個從小到大有序的數據序列,但這仍然不足以支持按照區間快速查找數據。緩存
而且須要考慮一下磁盤的IO,數據索引是存在磁盤上的,當使用索引的時候,會把索引加到內存中去,(內存的訪問速度完爆磁盤的訪問速度)當數據足夠大的時候,把索引完整的加入到內存當中,顯然不現實。數據結構
再來看B樹,B樹相比較平衡二叉查找樹,它叉開的比較多,算是多叉平衡查找樹。也就是說B樹的高度要低,叉要多。若是把二叉查找樹比作一我的,那麼這我的是又高又有瘦,B樹則是又矮又胖,某華真實寫照,扎心了。。。性能
ps:樹有多高,磁盤就讀寫多少次。還有mongodb的索引就用到了B。
B樹和B+樹實際上是一種樹,先由B樹到B+樹層層遞進,逐步分析。
rest
正由於B+樹的這種特性,所以這種數據結構經常使用於文件系統跟數據庫索引中。它經過對每一個節點存儲個數的擴展,使得對連續的數據可以進行較快的定位和訪問,可以有效減小查找時間,提升存儲的空間局部性從而減小IO操做。cdn
您的點贊和關注是對我最大的支持,謝謝!