淺析MySQL InnoDB中的B+樹索引

首先列舉下在面試過程中對(duì)于B+樹索引常見的兩個(gè)問題,希望通過本文簡(jiǎn)要解決這些問題:

  1. B+樹索引是什么?
  2. 為什么說B+樹比B樹更適合數(shù)據(jù)庫(kù)索引地熄?

B+樹索引介紹

B+tree

眾所周知叉讥,一顆傳統(tǒng)的M階B+樹需要滿足以下幾個(gè)要求:

  • 從根節(jié)點(diǎn)到葉節(jié)點(diǎn)的所有路徑都具有相同的長(zhǎng)度
  • 所有數(shù)據(jù)信息都存儲(chǔ)在葉子節(jié)點(diǎn)窘行,非葉子節(jié)點(diǎn)僅作為葉節(jié)點(diǎn)的索引存在
  • 根節(jié)點(diǎn)至少擁有兩個(gè)子樹
  • 每個(gè)樹節(jié)點(diǎn)最多擁有M個(gè)子樹
  • 每個(gè)樹節(jié)點(diǎn)(除了根節(jié)點(diǎn))擁有至少M(fèi)/2個(gè)子樹

B+樹是為了磁盤及其他存儲(chǔ)輔助設(shè)備而設(shè)計(jì)的一種平衡查找樹(不是二叉樹),在B+樹中图仓,所有記錄的節(jié)點(diǎn)按大小順序存放在同一層的葉節(jié)點(diǎn)中罐盔,各葉子節(jié)點(diǎn)用指針進(jìn)行連接,而B+樹索引本質(zhì)上就是B+樹在數(shù)據(jù)庫(kù)中的實(shí)現(xiàn),與純粹的B+樹數(shù)據(jù)結(jié)構(gòu)還是有點(diǎn)區(qū)別救崔。

B+樹與B+樹索引的區(qū)別如下:

B+樹 B+樹索引
存儲(chǔ)位置 內(nèi)存 磁盤
扇出率
并發(fā)控制 可以不考慮 需考慮
分裂方向 不需要考慮 向左惶看、向右

通常來說,B+樹索引用于基于磁盤的數(shù)據(jù)庫(kù)系統(tǒng)六孵,即數(shù)據(jù)最后持久化存放在磁盤上纬黎,每個(gè)頁(yè)的葉子節(jié)點(diǎn)一般包含較多的記錄,因此具有較高的扇出劫窒。這意味著在數(shù)據(jù)庫(kù)中B+樹索引高度一般較小本今,在2~3層,其高度也決定了磁盤I/O搜索的次數(shù)

還有一點(diǎn)需要注意的是烛亦,實(shí)際上根據(jù)B+樹索引并不能找到一個(gè)給定值的具體行诈泼,B+樹索引能找到的只是查找數(shù)據(jù)行所在的頁(yè)。然后數(shù)據(jù)庫(kù)通過把數(shù)據(jù)頁(yè)讀入內(nèi)存煤禽,再在內(nèi)存中進(jìn)行查找,最后得到查找的數(shù)據(jù)岖赋。

為什么說B+樹比B樹更適合數(shù)據(jù)庫(kù)索引檬果?

B+樹是上世紀(jì)70年代針對(duì)硬盤和單核處理器設(shè)計(jì)的,為了減少機(jī)械硬盤的尋道次數(shù)唐断,它采用了多叉樹結(jié)構(gòu)选脊,降低了索引結(jié)構(gòu)的深度,IO讀寫次數(shù)減少脸甘。

熟悉數(shù)據(jù)結(jié)構(gòu)的同學(xué)都知道恳啥,B樹也是多叉樹結(jié)構(gòu),一種自平衡的樹丹诀,而且B+樹是從B樹演化而來的钝的,那么為什么不使用B+樹的前身B樹呢?一些資料也表明B樹也適用于讀寫相對(duì)大的數(shù)據(jù)塊的存儲(chǔ)系統(tǒng)铆遭,例如磁盤硝桩。下面來看下用B樹做索引的結(jié)構(gòu):

b tree

上圖小紅方塊表示文件內(nèi)容在硬盤中的存儲(chǔ)位置。B樹相比B+樹的一個(gè)主要區(qū)別就在于B樹的分支節(jié)點(diǎn)上存儲(chǔ)著數(shù)據(jù)枚荣,而B+樹的分支節(jié)點(diǎn)只是葉子節(jié)點(diǎn)的索引而已碗脊。

從上面比較B+樹和B樹的結(jié)構(gòu),可以得出為什么使用B+樹做索引的一些原因(其實(shí)網(wǎng)上寫B(tài)+樹索引談到的大都是以下這些原因):

1. B+樹的磁盤讀取代價(jià)低

B+-tree的內(nèi)部節(jié)點(diǎn)并沒有指向關(guān)鍵字具體信息的指針橄妆,換句話說衙伶,即分支節(jié)點(diǎn)沒有存儲(chǔ)數(shù)據(jù)祈坠,因此其內(nèi)部節(jié)點(diǎn)相對(duì)B 樹更小。如果把所有同一內(nèi)部節(jié)點(diǎn)的關(guān)鍵字存放在同一盤塊中矢劲,那么盤塊所能容納的關(guān)鍵字?jǐn)?shù)量也越多赦拘。一次性讀內(nèi)存中的需要查找的關(guān)鍵字也就越多。相對(duì)來說IO讀寫次數(shù)也就降低了卧须。

2. B+樹的查詢效率更加穩(wěn)定

在B+樹中另绩,由于分支節(jié)點(diǎn)并不是最終指向文件內(nèi)容的節(jié)點(diǎn),分支節(jié)點(diǎn)只是葉子節(jié)點(diǎn)的索引花嘶,所以對(duì)于任意關(guān)鍵字的查找都必須從根節(jié)點(diǎn)走到分支節(jié)點(diǎn)笋籽,所有關(guān)鍵字查詢路徑長(zhǎng)度相同,每個(gè)數(shù)據(jù)查詢效率相當(dāng)椭员。而對(duì)于B樹而言车海,其分支節(jié)點(diǎn)上也保存有數(shù)據(jù),對(duì)于每一個(gè)數(shù)據(jù)的查詢所走的路徑長(zhǎng)度是不一樣的隘击,效率也不一樣侍芝。

3. B+樹便于執(zhí)行掃庫(kù)操作

由于B+樹的數(shù)據(jù)都存儲(chǔ)在葉子節(jié)點(diǎn)上,分支節(jié)點(diǎn)均為索引埋同,方便掃庫(kù)州叠,只需掃一遍葉子即可。但是B樹在分支節(jié)點(diǎn)上都保存著數(shù)據(jù)凶赁,要找到具體的順序數(shù)據(jù)咧栗,需要執(zhí)行一次中序遍歷來查找。所以B+樹更加適合范圍查詢的情況虱肄,在解決磁盤IO性能的同時(shí)解決了B樹元素遍歷效率低下的問題

小結(jié)

再次總結(jié)下B+樹索引致板,它采用了多叉樹的結(jié)構(gòu),降低了索引結(jié)構(gòu)的深度咏窿,避免了傳統(tǒng)二叉樹結(jié)構(gòu)中絕大部分的隨機(jī)訪問操作斟或,有效減少了磁盤磁頭的尋道次數(shù)。B+樹索引查詢效率穩(wěn)定集嵌,也有利于進(jìn)行范圍查詢萝挤。

參考資料 & 鳴謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纸淮,一起剝皮案震驚了整個(gè)濱河市平斩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咽块,老刑警劉巖绘面,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡揭璃,警方通過查閱死者的電腦和手機(jī)晚凿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘦馍,“玉大人歼秽,你說我怎么就攤上這事∏樽椋” “怎么了燥筷?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)院崇。 經(jīng)常有香客問我肆氓,道長(zhǎng),這世上最難降的妖魔是什么底瓣? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任谢揪,我火速辦了婚禮,結(jié)果婚禮上捐凭,老公的妹妹穿的比我還像新娘拨扶。我一直安慰自己,他們只是感情好茁肠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布患民。 她就那樣靜靜地躺著,像睡著了一般垦梆。 火紅的嫁衣襯著肌膚如雪酒奶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天奶赔,我揣著相機(jī)與錄音,去河邊找鬼杠氢。 笑死站刑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鼻百。 我是一名探鬼主播绞旅,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼温艇!你這毒婦竟也來了因悲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤勺爱,失蹤者是張志新(化名)和其女友劉穎晃琳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卫旱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年人灼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾翼。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡投放,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出适贸,到底是詐尸還是另有隱情灸芳,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布拜姿,位于F島的核電站烙样,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏砾隅。R本人自食惡果不足惜误阻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴埂。 院中可真熱鬧究反,春花似錦、人聲如沸儒洛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琅锻。三九已至卦停,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恼蓬,已是汗流浹背惊完。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留处硬,地道東北人小槐。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荷辕,于是被迫代替她去往敵國(guó)和親凿跳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子疮方。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外控嗜,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,219評(píng)論 0 25
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,928評(píng)論 2 89
  • 14歲的我們是什么樣疆栏? 18歲的我們又是什么樣的曾掂? 4年改變了什么?成為了什么承边? 那么再過四年 22歲的我們呢遭殉? ...
    TrySmile365閱讀 134評(píng)論 0 0
  • 隨著互聯(lián)網(wǎng)的快速發(fā)展,現(xiàn)在各行各業(yè)的從業(yè)者博助,都在往互聯(lián)網(wǎng)轉(zhuǎn)型险污,也就是現(xiàn)在的“互聯(lián)網(wǎng)+”,實(shí)體行業(yè)與互聯(lián)網(wǎng)的...
    創(chuàng)業(yè)的白羊閱讀 621評(píng)論 3 0