【面試題】MySQL索引相關的面試題(紅黑樹,hash,B樹,B+樹)

自己整理了幾個面試題分享給大家

問題1:紅黑樹爲什麼那樣設計?

首先聊一下二叉搜索樹,主要特點是左節點比根節點小,右節點比根節點大,並且左右子樹都是二叉搜索樹。缺點是在極端情況下,比如插入都是有序的,就會出現退化的情況有序序列樹退化成鏈表。

二叉搜索樹

二叉搜索樹

	退化成鏈表的二叉搜索樹

在這裏插入圖片描述

此時,要想讓樹的節點平均分佈就需要平衡樹了,紅黑樹就是平衡樹的一種(平衡二叉搜索樹)。然後,一棵樹的查詢性能取決於樹的高度,紅黑樹讓樹儘可能平衡,就是爲了降低樹的高度。(java中紅黑樹的實現treeset)

紅黑樹

在這裏插入圖片描述

問題2:什麼是B樹?

B樹是一種平衡多路搜索樹,他的每個節點可以擁大於等於2個子節點,M路的B樹最多能擁有M個子節點,一個節點中有 m 個子節點則存在 m-1 個記錄,記錄按照遞增次序進行排列,葉節點都在同一層上。B樹之所以多路(也就是每個節點上可存多個記錄)是爲了降低高度,路數越多,樹高度越低,查詢性能也高。但也不能是無限的,否則就退化成有序數組了。

B樹

在這裏插入圖片描述

退化成有序數組的B樹

在這裏插入圖片描述

問題3:什麼是B+樹?

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

B+樹

在這裏插入圖片描述

問題4:爲什麼用B+樹存儲索引而不用B樹?

這也是和業務場景相關的,一般去數據庫查詢數據,不一定只選一條,很多時候會選多條數據,在查多條情況下,B樹需要做局部的中序遍歷,可能要跨層訪問。而B+樹由於所有數據都在葉子結點,不用跨層,同時由於有鏈表結構,只需要找到首尾,通過鏈表就能把所有數據取出來了。

問題5:爲什麼用B+樹做索引?

我們在MySQL中的數據一般是放在磁盤中的,讀取數據的時候肯定會有訪問磁盤的操作,磁盤中有兩個機械運動的部分,分別是盤片旋轉和磁臂移動。盤片旋轉就是我們市面上所提到的多少轉每分鐘,而磁臂移動則是在盤片旋轉到指定位置以後,移動磁臂後開始進行數據的讀寫。那麼這就存在一個定位到磁盤中的塊的過程,而定位是磁盤的存取中花費時間比較大的一塊,畢竟機械運動花費的時候要遠遠大於電子運動的時間。當大規模數據存儲到磁盤中的時候,顯然定位是一個非常花費時間的過程,但是我們可以通過B樹進行優化,提高磁盤讀取時定位的效率。

爲什麼B類樹可以進行優化呢?我們可以根據B類樹的特點,構造一個多階的B類樹,然後在儘量多的在結點上存儲相關的信息,保證層數儘量的少,以便後面我們可以更快的找到信息,磁盤的I/O操作也少一些,而且B類樹是平衡樹,每個結點到葉子結點的高度都是相同,這也保證了每個查詢是穩定的。

一般去數據庫查詢數據,不一定只選一條,很多時候會選多條數據,在查多條情況下,B樹需要做局部的中序遍歷,可能要跨層訪問。而B+樹由於所有數據都在葉子結點,不用跨層,同時由於有鏈表結構,只需要找到首尾,通過鏈表就能把所有數據取出來了。

問題6:爲什麼用B+樹不用紅黑樹?

總的來說,B/B+樹是爲了磁盤或其它存儲設備而設計的一種平衡多路查找樹(相對於二叉,B樹每個內節點有多個分支),與紅黑樹相比,在相同數據情況下,一顆B/B+樹的高度遠遠小於紅黑樹的高度,這樣在磁盤查找數據時,磁臂定位次數也就越少,查詢效率越高。B/B+樹上操作的時間通常由存取磁盤的時間和CPU計算時間這兩部分構成,而CPU的速度非常快,所以B樹的操作效率取決於訪問磁盤的次數,關鍵字總數相同的情況下B樹的高度越小,磁盤I/O所花的時間越少。

問題7:既然hash比B+樹快,爲什麼MySQL數據庫要用B+樹存儲索引?

如果只選一個數據,那確實是hash更快。但是數據庫中經常會選擇多條,這時候由於B+樹索引有序,並且又有鏈表相連,它的查詢效率比hash就快很多了。
而且數據庫中的索引一般是在磁盤上,數據量大的情況可能無法一次裝入內存,B+樹的設計可以允許數據分批加載,同時樹的高度較低,提高查找效率。

參考文章:
爲什麼MySQL數據庫索引選擇使用B+樹?
【面試現場】爲什麼MySQL數據庫要用B+樹存儲索引?

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