數(shù)據(jù)庫索引為什么用B+樹實現(xiàn)歉摧?

為什么大多數(shù)數(shù)據(jù)庫索引都使用B+樹來實現(xiàn)呢艇肴?這涉及到數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)叁温、計算機存儲層次結(jié)構(gòu)等等復(fù)雜的理論知識再悼,但是不用擔(dān)心,這篇文章20分鐘之后就會給你答案膝但。

這篇文章是一系列數(shù)據(jù)庫索引文章中的最后一篇冲九,這個系列包括了下面四篇文章:

  1. 數(shù)據(jù)庫索引是什么?新華字典來幫你 —— 理解

  2. 數(shù)據(jù)庫索引融會貫通 —— 深入

  3. 20分鐘數(shù)據(jù)庫索引設(shè)計實戰(zhàn) —— 實戰(zhàn)

  4. 數(shù)據(jù)庫索引為什么用B+樹實現(xiàn)? —— 擴展

這一系列涵蓋了數(shù)據(jù)庫索引從理論到實踐的一系列知識莺奸,一站式解決了從理解到融會貫通的全過程丑孩,相信每一篇文章都可以給你帶來更深入的體驗。

為什么使用B+樹灭贷?

大家在數(shù)學(xué)課上一定聽說過一個例子温学,在一堆已經(jīng)排好序的數(shù)字當(dāng)中找出一個特定的數(shù)字的最好辦法是一種叫“二分查找”的方式。具體的過程就是先找到這些數(shù)字中間的那一個數(shù)甚疟,然后比較目標(biāo)數(shù)字是大于還是小于這個數(shù)仗岖;然后根據(jù)結(jié)果繼續(xù)在前一半或者后一半數(shù)字中繼續(xù)查找。

這就類似于數(shù)據(jù)結(jié)構(gòu)中的二叉樹览妖,二叉樹就是如下的一種結(jié)構(gòu)轧拄,樹中的每個節(jié)點至多可以有兩個子節(jié)點,而B+樹每個節(jié)點則可以有N個子節(jié)點讽膏。

image.png

這里就不具體展開講解二叉樹了檩电,我們只需要知道,平衡的二叉樹是內(nèi)存中查詢效率最高的一種數(shù)據(jù)結(jié)構(gòu)就可以了府树。

但是目前常用的數(shù)據(jù)庫中俐末,絕大多數(shù)的索引都是使用B+樹實現(xiàn)的。那么為什么明明是二叉樹查詢效率最高奄侠,數(shù)據(jù)庫中卻偏偏要使用B+樹而不是二叉樹來實現(xiàn)索引呢鹅搪?

計算機存儲層次結(jié)構(gòu)

image.png

計算機中的存儲結(jié)構(gòu)分為好幾個部分,從上到下大致可以分為寄存器遭铺、高速緩存、主存儲器恢准、輔助存儲器魂挂。其中主存儲器,也就是我們常說的內(nèi)存馁筐;輔助存儲器也被稱為外存涂召,比較常見的就是磁盤、SSD敏沉,可以用來保存文件果正。在這個存儲結(jié)構(gòu)中,每一級存儲的速度都比上一級慢很多盟迟,所以程序訪問越上層存儲中的數(shù)據(jù)秋泳,速度就會越快。

有過編程經(jīng)驗的小伙伴都知道攒菠,程序運行過程中操作的基本都是內(nèi)存迫皱,對外存中數(shù)據(jù)的訪問往往需要寫一些文件的讀取和寫入代碼才能實現(xiàn)。這正是因為CPU的計算速度比存儲的I/O速度(輸入/輸出速度)快很多所做的優(yōu)化辖众,因為CPU在每次計算完成之后就需要等待下一批的數(shù)據(jù)進(jìn)入卓起,這個等待的時間越短和敬,計算機運行得越快。

所以對于數(shù)據(jù)庫索引來說戏阅,因為數(shù)據(jù)量很大昼弟,所以基本都是保存在外存中的,這樣的話數(shù)據(jù)庫讀取一個索引節(jié)點的成本就非常大了奕筐。在數(shù)據(jù)量一樣大的情況下舱痘,我們可以知道,B+樹的單個節(jié)點中包含的值個數(shù)越多那么樹中需要的節(jié)點總數(shù)就會越少救欧,這樣查詢一次數(shù)據(jù)需要訪問的節(jié)點數(shù)就更少了衰粹。

如果你對B+樹還不熟悉,可以到這篇文章中找到答案——數(shù)據(jù)庫索引融會貫通 笆怠。

如果我們把二叉樹看做是特殊的B+樹(每個節(jié)點只有一個值和前后兩個指針的B+樹)铝耻,那么就可以得出結(jié)論:因為B+樹的節(jié)點中包含的值個數(shù)(多個值)比二叉樹(1個值)更多,所以在B+樹中查詢所需要的節(jié)點數(shù)就更少蹬刷。那么如果每次讀取的成本是一樣的話瓢捉,因為總成本=讀取次數(shù)*單次讀取成本,我們就可以證明B+樹的查詢成本就比二叉樹小得多了办成。

節(jié)點讀取成本

但是我們知道泡态,讀取更多數(shù)據(jù)肯定會需要更大的成本,那么為什么數(shù)據(jù)庫索引使用B+樹還是會比二叉樹更好呢迂卢?這就需要一些更高深的操作系統(tǒng)知識來解釋了某弦。

在現(xiàn)代的操作系統(tǒng)中,把數(shù)據(jù)從外存讀到內(nèi)存所使用的單位一般被稱為“頁”而克,每次讀取數(shù)據(jù)都需要讀入整數(shù)個的“頁”靶壮,而不能讀入半頁或者0.8頁。一頁的大小由操作系統(tǒng)決定员萍,常見的頁大小一般為4KB=4096字節(jié)腾降。所以不管我們是要讀取1字節(jié)還是2KB,最后都是需要讀入一個完整的4KB大小的頁的碎绎,那么一個節(jié)點的讀取成本就取決于需要讀入的頁數(shù)螃壤。

在這樣的情況下,如果一個節(jié)點的大小小于一頁的大小筋帖,那么就會有一部分時間花在讀取我們根本不需要的數(shù)據(jù)上(節(jié)點之外的數(shù)據(jù))奸晴,二叉樹在這方面就會浪費很多時間;而如果一個節(jié)點的大小大于一頁日麸,哪怕是一頁的整數(shù)倍蚁滋,那我們也可能在一個節(jié)點的中間就找到了我們需要的指針進(jìn)入了下一級的節(jié)點,這樣這個指針后面的數(shù)據(jù)都白白讀取了,如果不需要這些數(shù)據(jù)可能我們就可以少讀幾頁了辕录。

所以睦霎,綜上所述,數(shù)據(jù)庫索引使用節(jié)點大小恰好等于操作系統(tǒng)一頁大小的B+樹來實現(xiàn)是效率最高的選擇走诞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末副女,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚣旱,更是在濱河造成了極大的恐慌碑幅,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞绿,死亡現(xiàn)場離奇詭異沟涨,居然都是意外死亡,警方通過查閱死者的電腦和手機异吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門裹赴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诀浪,你說我怎么就攤上這事棋返。” “怎么了雷猪?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵睛竣,是天一觀的道長。 經(jīng)常有香客問我求摇,道長射沟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任与境,我火速辦了婚禮躏惋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚷辅。我一直安慰自己,他們只是感情好距误,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布簸搞。 她就那樣靜靜地躺著,像睡著了一般准潭。 火紅的嫁衣襯著肌膚如雪趁俊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天刑然,我揣著相機與錄音寺擂,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛怔软,可吹牛的內(nèi)容都是我干的垦细。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挡逼,長吁一口氣:“原來是場噩夢啊……” “哼括改!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起家坎,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘱能,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虱疏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惹骂,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年做瞪,在試婚紗的時候發(fā)現(xiàn)自己被綠了对粪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡穿扳,死狀恐怖衩侥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矛物,我是刑警寧澤茫死,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站履羞,受9級特大地震影響峦萎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忆首,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一爱榔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糙及,春花似錦详幽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柱搜,卻和暖如春迟郎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聪蘸。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工宪肖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留表制,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓控乾,卻偏偏與公主長得像么介,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阱持,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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