本文獻給準備面試或者是還在面試的你繁仁。常見面試題涉馅,送分題目,不拿白不拿改备。
本文收錄在個人博客《愚公要移山》中控漠,地址 www.javachat.cc
這篇是修改版,針對知乎上很多人提出的問題悬钳,進行了一次修復
一盐捷、B樹和B+樹的區(qū)別
很明顯,我們想向弄清楚原因就要知道B樹和B+樹的區(qū)別默勾。為了不長篇大論碉渡。我們直接給出他們的形式總結他們的特點。
1母剥、B樹
B樹是一種自平衡的搜索樹滞诺,形式很簡單:
這就是一顆B-樹。針對我們這個問題的最核心的特點如下:
(1)多路环疼,非二叉樹
(2)每個節(jié)點既保存索引习霹,又保存數據
(3)搜索時相當于二分查找
其他的基本上都是一些常見的數據結構,假定都已經了解了B樹相關的結構炫隶。
2淋叶、B+樹
B+樹是B樹的變種
最核心的特點如下:
(1)多路非二叉
(2)只有葉子節(jié)點保存數據
(3)搜索時相當于二分查找
(4)增加了相鄰接點的指向指針。
從上面我們可以看出最核心的區(qū)別主要有倆伪阶,
一個是數據的保存位置:B樹保存在所有的節(jié)點中煞檩,B+樹保存在葉子節(jié)點
一個是相鄰節(jié)點的指向:B樹葉子節(jié)點之間沒有指針处嫌,B+樹有
這里區(qū)別分別給B樹和B+樹帶來了什么好處呢?其實對于數據庫來說斟湃,選用什么數據結構無非就是為了增刪改查和存儲更加高效熏迹,因為找特點時也要從這個點去回答。
3凝赛、從區(qū)別找特點
第一:查找元素
(1)B樹的數據保存在所有節(jié)點注暗,查詢復雜度最好是 O(1)。
(2)B+樹的數據保存在葉子節(jié)點哄酝,查詢時間復雜度固定是O(log(n))
第二:區(qū)間查找
(1)B樹每個節(jié)點 key 和 data 在一起友存,則無法區(qū)間查找。
(2)B+樹相鄰接點的指針可以大大增加區(qū)間訪問性陶衅,可使用在范圍查詢等
第三:存儲
(1)B樹每個節(jié)點即保存數據又保存索引屡立,所以每一節(jié)點特別大,這一層所有節(jié)點加起來數據量將非常大搀军。磁盤每次IO一定量的數據膨俐,對于Mysql來說如何衡量查詢效率呢?就是磁盤IO次數罩句。既然B樹每一層特別大焚刺,那每一層就需要對數據分開從而進行多次IO操作。所有Mysql不用门烂。
(2)B+樹更適合外部存儲乳愉,也就是磁盤存儲。由于內節(jié)點無 data 域屯远,每個節(jié)點能索引的范圍更大更精確蔓姚,所以不需要用B+樹。
有了他們的區(qū)別之后慨丐,現在我們再來解釋這個原因就好多了坡脐。
二、原因解釋
上面解釋了不使用的原因房揭,我們再來看為什么Mysql使用B+樹备闲,而MongoDB使用B樹,想要解釋原因捅暴,我們還必須要了解一下MongoDB和Mysql的基本概念恬砂。
1、MongoDB
MongoDB 是文檔型的數據庫蓬痒,是一種 nosql觉既,它使用類 Json 格式保存數據。比如之前我們的表可能有用戶表乳幸、訂單表瞪讼、購物籃表等等,還要建立他們之間的外鍵關聯關系粹断。但是類Json就不一樣了符欠。
我們可以看到這種形式更簡單,通俗易懂瓶埋。那為什么 MongoDB 使用B-樹呢希柿?
MongoDB使用B樹,所有節(jié)點都有Data域养筒,只要找到指定索引就可以進行訪問曾撤,無疑單次查詢平均快于Mysql。
2晕粪、Mysql
Mysql作為一個關系型數據庫挤悉,數據的關聯性是非常強的,區(qū)間訪問是常見的一種情況巫湘,B+樹由于數據全部存儲在葉子節(jié)點装悲,并且通過指針串在一起,這樣就很容易的進行區(qū)間遍歷甚至全部遍歷尚氛。
還有一點诀诊,B+樹只有葉子節(jié)點保存數據,所以每一節(jié)點比較小阅嘶,每一層所有節(jié)點加起來數據量也相對比較小属瓣。磁盤每次IO一定量的數據,對于Mysql來說讯柔。既然B+樹每一層小抡蛙,那每一層只需要少量IO操作。
這倆區(qū)別的核心如果你能看懂B-樹和B+樹的區(qū)別就很容易理解磷杏。
回復關鍵字獲取java相關5T資源溜畅,
視頻,電子書,面試,簡歷,IDEA破解等
只有你想不到的,沒有找不到