2020-01-25索引中的btree與b+tree

B 樹(shù)的結(jié)構(gòu)如下圖所示:


image.png

B 樹(shù)作為平衡的多路搜索樹(shù),它的每一個(gè)節(jié)點(diǎn)最多可以包括 M 個(gè)子節(jié)點(diǎn)窝稿,M 稱為 B 樹(shù)的階凿掂。同時(shí)你能看到,每個(gè)磁盤(pán)塊中包括了關(guān)鍵字和子節(jié)點(diǎn)的指針踪少。如果一個(gè)磁盤(pán)塊中包括了 x 個(gè)關(guān)鍵字糠涛,那么指針數(shù)就是 x+1。對(duì)于一個(gè) 100 階的 B 樹(shù)來(lái)說(shuō)萝究,如果有 3 層的話最多可以存儲(chǔ)約 100 萬(wàn)的索引數(shù)據(jù)锉罐。對(duì)于大量的索引數(shù)據(jù)來(lái)說(shuō),采用 B 樹(shù)的結(jié)構(gòu)是非常適合的栽连,因?yàn)闃?shù)的高度要遠(yuǎn)小于二叉樹(shù)的高度侨舆。
一個(gè) M 階的 B 樹(shù)(M>2)有以下的特性:
1.根節(jié)點(diǎn)的兒子數(shù)的范圍是[2,M]挨下。
2.每個(gè)中間節(jié)點(diǎn)包含 k-1 個(gè)關(guān)鍵字和 k 個(gè)孩子,孩子的數(shù)量 = 關(guān)鍵字的數(shù)量 +1臭笆,k 的取值范圍為[ceil(M/2), M]愁铺。
3.葉子節(jié)點(diǎn)包括 k-1 個(gè)關(guān)鍵字(葉子節(jié)點(diǎn)沒(méi)有孩子),k 的取值范圍為[ceil(M/2), M]茵乱。
4.假設(shè)中間節(jié)點(diǎn)節(jié)點(diǎn)的關(guān)鍵字為:Key[1], Key[2], …, Key[k-1]瓶竭,且關(guān)鍵字按照升序排序渠羞,即 Key[i]<Key[i+1]智哀。此時(shí) k-1 個(gè)關(guān)鍵字相當(dāng)于劃分了 k 個(gè)范圍,也就是對(duì)應(yīng)著 k 個(gè)指針渗蟹,即為:P[1], P[2], …, P[k]赞辩,其中 P[1]指向關(guān)鍵字小于 Key[1]的子樹(shù),P[i]指向關(guān)鍵字屬于 (Key[i-1], Key[i]) 的子樹(shù)世落,P[k]指向關(guān)鍵字大于 Key[k-1]的子樹(shù)糟需。
5.所有葉子節(jié)點(diǎn)位于同一層。

什么是 B+ 樹(shù)

B+ 樹(shù)基于 B 樹(shù)做出了改進(jìn)武花,主流的 DBMS 都支持 B+ 樹(shù)的索引方式杈帐,比如 MySQL挑童。B+ 樹(shù)和 B 樹(shù)的差異在于以下幾點(diǎn):
1.有 k 個(gè)孩子的節(jié)點(diǎn)就有 k 個(gè)關(guān)鍵字。也就是孩子數(shù)量 = 關(guān)鍵字?jǐn)?shù)娃兽,而 B 樹(shù)中尽楔,孩子數(shù)量 = 關(guān)鍵字?jǐn)?shù) +1。
2.非葉子節(jié)點(diǎn)的關(guān)鍵字也會(huì)同時(shí)存在在子節(jié)點(diǎn)中轻要,并且是在子節(jié)點(diǎn)中所有關(guān)鍵字的最大(或最锌衙濉)驹碍。
3.非葉子節(jié)點(diǎn)僅用于索引凡恍,不保存數(shù)據(jù)記錄嚼酝,跟記錄有關(guān)的信息都放在葉子節(jié)點(diǎn)中竟坛。而 B 樹(shù)中,非葉子節(jié)點(diǎn)既保存索引涎跨,也保存數(shù)據(jù)記錄崭歧。
4.所有關(guān)鍵字都在葉子節(jié)點(diǎn)出現(xiàn),葉子節(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表叔营,而且葉子節(jié)點(diǎn)本身按照關(guān)鍵字的大小從小到大順序鏈接所宰。


image.png

B+ 樹(shù)和 B 樹(shù)有個(gè)根本的差異在于仔粥,B+ 樹(shù)的中間節(jié)點(diǎn)并不直接存儲(chǔ)數(shù)據(jù)。這樣的好處都有什么呢勘究?
首先斟冕,B+ 樹(shù)查詢效率更穩(wěn)定。因?yàn)?B+ 樹(shù)每次只有訪問(wèn)到葉子節(jié)點(diǎn)才能找到對(duì)應(yīng)的數(shù)據(jù)景描,而在 B 樹(shù)中秀撇,非葉子節(jié)點(diǎn)也會(huì)存儲(chǔ)數(shù)據(jù),這樣就會(huì)造成查詢效率不穩(wěn)定的情況棠绘,有時(shí)候訪問(wèn)到了非葉子節(jié)點(diǎn)就可以找到關(guān)鍵字,而有時(shí)需要訪問(wèn)到葉子節(jié)點(diǎn)才能找到關(guān)鍵字夜矗。
其次让虐,B+ 樹(shù)的查詢效率更高,這是因?yàn)橥ǔ?B+ 樹(shù)比 B 樹(shù)更矮胖(階數(shù)更大对扶,深度更低)惭缰,查詢所需要的磁盤(pán) I/O 也會(huì)更少从媚。同樣的磁盤(pán)頁(yè)大小,B+ 樹(shù)可以存儲(chǔ)更多的節(jié)點(diǎn)關(guān)鍵字喷众。
不僅是對(duì)單個(gè)關(guān)鍵字的查詢上紧憾,在查詢范圍上,B+ 樹(shù)的效率也比 B 樹(shù)高憔四。這是因?yàn)樗嘘P(guān)鍵字都出現(xiàn)在 B+ 樹(shù)的葉子節(jié)點(diǎn)中般眉,并通過(guò)有序鏈表進(jìn)行了鏈接。而在 B 樹(shù)中則需要通過(guò)中序遍歷才能完成查詢范圍的查找柿汛,效率要低很多埠对。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末项玛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锥惋,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淹父,死亡現(xiàn)場(chǎng)離奇詭異怎虫,居然都是意外死亡大审,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)粮彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姜骡,“玉大人圈澈,你說(shuō)我怎么就攤上這事】嫡唬” “怎么了啥么?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵悬荣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我隅熙,道長(zhǎng)囚戚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任匾二,我火速辦了婚禮,結(jié)果婚禮上皮璧,老公的妹妹穿的比我還像新娘分飞。我一直安慰自己譬猫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布别洪。 她就那樣靜靜地躺著柳刮,像睡著了一般秉颗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站宗,一...
    開(kāi)封第一講書(shū)人閱讀 50,021評(píng)論 1 291
  • 那天梢灭,我揣著相機(jī)與錄音敏释,去河邊找鬼。 笑死钥顽,一個(gè)胖子當(dāng)著我的面吹牛蜂大,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兄墅,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼澳叉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沐悦!你這毒婦竟也來(lái)了藏否?” 一聲冷哼從身側(cè)響起充包,我...
    開(kāi)封第一講書(shū)人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤误证,失蹤者是張志新(化名)和其女友劉穎修壕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蓝谨,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡譬巫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年芦昔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃肿。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咕缎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出料扰,到底是詐尸還是另有隱情凭豪,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布晒杈,位于F島的核電站嫂伞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拯钻。R本人自食惡果不足惜帖努,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粪般。 院中可真熱鬧然磷,春花似錦刊驴、人聲如沸姿搜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舅柜。三九已至梭纹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間致份,已是汗流浹背变抽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氮块,地道東北人绍载。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滔蝉,于是被迫代替她去往敵國(guó)和親击儡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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