1. 程式人生 > >B樹,B+樹,紅黑樹 資料庫常見面試題

B樹,B+樹,紅黑樹 資料庫常見面試題

Q0.資料庫索引有哪些,優缺點?


hash索引和B+樹索引
hash索引等值查詢效率高,但是不能排序,因此不能進行範圍查詢
B+樹索引資料有序,能夠進行範圍查詢

Q1.為什麼不用二叉查詢樹作為資料庫索引?


二叉查詢樹,查詢到指定資料,效率其實很高logn。但是資料庫索引檔案有可能很大,關係型資料儲存了上億條資料,索引檔案大則上G,不可能全部放入記憶體中,
而是需要的時候換入記憶體,方式是磁碟頁。一般來說樹的一個節點就是一個磁碟頁。如果使用二叉查詢樹,那麼每個節點儲存一個元素,查詢到指定元素,需要進行大量的磁碟IO,效率很低。
而B樹解決了這個問題,通過單一節點包含多個data,大大降低了樹的高度,大大減少了磁碟IO次數。

Q2.B樹和二叉查詢樹的效能對比?


B樹包括B+樹的設計思想都是儘可能的降低樹的高度,以此降低磁碟IO的次數,因為一個索引節點就表示一個磁碟頁,頁的換入換出次數越多,表示磁碟IO次數越多,越低效。
B樹演算法減少定位資料所在的節點時所經歷的磁碟IO次數,從而加快存取速度。
假設一個節點可以容納100個值,那麼3層的B樹可以容納100萬個資料。(根節點100值,第二層可以儲存99個節點(k-1),也就是99*100 個值,第三層可以儲存
(99*100-1)*100)結果是近似100萬個資料。而如果使用二叉查詢樹,則需要將近20層,也就是進行20次磁碟IO,效能差距如此之大。
如mongoDB資料庫使用,單次查詢平均快於Mysql(但側面來看Mysql至少平均查詢耗時差不多)。

Q3.B+對比B樹的優點?


因為B樹的每個節點除了儲存指向子節點的索引之外,還有data域,因此單一節點儲存的指向子節點的索引並不是很多,樹高度較高,磁碟IO次數較多,
而B+樹單一節點儲存的指向子節點的索引更多,B+樹空間利用率高,因此B+樹高度更低,磁碟IO次數更少,效能更好。
因為B樹的中間節點儲存了資料,所以整個樹的每一層都有可能查詢到要查詢的資料,查詢效能不穩定,
而B+樹所有的data都儲存在葉子節點,且葉子節點位於同一層,因此查詢效能穩定。
B樹如果想要進行範圍查詢,需要頻繁的進行二叉樹的中序遍歷,進行範圍查詢比較複雜,
B+樹要查詢的元素都位於葉子節點,且連線形成有序連結串列,便於範圍查詢。

Q4.B樹,B+樹使用場景。


B樹主要用於檔案系統,和部分資料庫索引,如文件型資料庫mongodb
B+樹主要用於mysql資料庫索引。

Q5.為什麼資料庫索引不用紅黑樹而用B+樹?


紅黑樹當插入刪除元素的時候會進行頻繁的變色與旋轉(左旋,右旋),來保證紅黑樹的性質,浪費時間。
但是當資料量較小,資料完全可以放入記憶體中,不需要進行磁碟IO,這時候,紅黑樹時間複雜度比B+樹低。
比如TreeSet TreeMap 和HashMap (jdk1.8)就是使用紅黑樹作為底層資料結構。

參考
https://blog.csdn.net/qq_36183935/article/details/81095212
https://mp.weixin.qq.com/s/rDCEFzoKHIjyHfI_bsz5Rw
https://mp.weixin.qq.com/s/jRZMMONW3QP43dsDKIV9VQ