關於Mysql索引的B樹到B+樹結構分析

前提知識

這篇博客主要是爲了分析B樹及B+樹作爲索引的應用原因,而不是這兩種樹結構的內存模型,所以很多知識點都是簡單的說了哈。

查找方法

首先B+樹的索引結構,在查找時使用的是二分查找的方法。類似使用二分查找的還有很多,比如Redis的跳錶查詢,kafuka的日誌消息查詢也是使用這種方法。時間複雜度O(logn)

計算機預讀取機制

這個就屬於計算機機制的方面內容了,簡單來說:在計算機讀取到一個字節,大概率也會讀取到其周圍的數據,所以計算機會提前將你讀取數據的周圍數據同時加載到內存,加快你訪問周圍數據的速度。

B樹

B樹在每個節點上都用來存儲多個關鍵字(也就可以理解我們說的是索引),如果我們將節點大小設置成磁盤大小,那麼我們在查找到一個在該節點的數據時,通過預讀機制周圍數據同時加載到內存中,所以對於B樹來說絕大多數的查詢都發生在內存中。
這裏可以提一下關於爲什麼不用紅黑樹,由於紅黑樹H高的問題,可能導致數據距離較遠,所以查詢時會多次去磁盤讀取,效率低下不及B樹。

B+樹

關於B+樹,與B樹最大的不同處,也就是B+樹只用葉子節點(就是樹最下方的節點)存儲數據,非葉子節點存儲指針指向下一個節點(理解爲是用來導航的),Mysql也是正是利用這點在作爲索引時相比B樹提高訪問速度,稍後解釋。

查找過程分析

先給出一個樹結構,我們下面就根據這個圖來分析B樹和B+樹的作爲索引時的查找過程。
樹結構
這張圖不是很嚴謹,主要作爲一個樹結構來看,而不是作爲B樹或B+樹結構來看。
其實我們絕大多數的根據索引查詢,分爲兩種。也就是根據Id查找一條數據、範圍查找數據。

單條數據查找

  1. B樹單條數據查找過程
    首先我們從根節點一次一次的通過根節點向不同的葉子節點遍歷,直到找到存放數據的節點。但是我們這裏注意一點,由於B樹是每個節點上都存放數據,所以我們在查找到一條數據時,通過預加載會把這個節點的數據加載到內存,以便加快訪問周圍數據。
  2. B+樹單條數據查找過程
    遍歷的方式與B樹一摸一樣,沒有任何區別。但是由於B+樹的數據都存放在葉子節點上,所以我們通過一個預加載時,可以加載更多數據到內存當中。
  3. 比較
    在單條數據的讀取時,最大的區別就是,B+樹結構通過預加載機制可以比B樹結構加載更多周圍數據到內存中。這樣一些情況下B+樹在訪問數據可能比B樹更快。
    B+樹>=B樹,B+樹小勝。

範圍數據查找

  1. B樹範圍數據查找過程
    B樹在範圍查詢時,B樹依然需要通過從根節點到葉子節點的一遍遍遍歷,來找到符合範圍條件的數據。
  2. B+樹範圍數據查找過程
    B+樹由於所有數據都存放在葉子節點上,並且葉子節點存放數據還是有順序的。所以在範圍查詢時,只需要遍歷葉子節點,所以效率相比B樹要高的多得多。
  3. 比較
    由於B+樹的存儲數據結構,在範圍查詢時只需要遍歷有序的葉子節點,找到“頭”和“尾”,中間的葉子節點就是我們要的範圍數據。
    B+樹>>B樹,B+樹大勝。

總結

作爲Mysql的索引結構,一定是爲了加快查詢速度,通過不同情況下的查詢分析,我們可以看出B+樹是要比B樹更適合的,所以Mysql也就選用了B+樹作爲索引的結構。
在說點閒話吧,最近跟朋友想做一個網站,現在前提條件準備都有了,但是現在很想通過seo把網站排名到百度搜索前面,但是很懵哈哈哈,有沒有比較擅長這面的大佬交流交流啊啊啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章