一、B+樹查詢的穩(wěn)定性為什么重要
首先最大的優(yōu)勢還是磁盤IO和范圍,從我個(gè)人的看法看,穩(wěn)定性(每次查詢必須從根走到葉子節(jié)點(diǎn))這意味行為可預(yù)估,這在引擎內(nèi)部建立執(zhí)行計(jì)劃時(shí)會(huì)方便控制變量。
為了實(shí)現(xiàn)動(dòng)態(tài)多層索引,通常采用 B-樹 和 B+樹。但是,用于索引的 B-樹 存在缺陷,它的所有中間結(jié)點(diǎn)均存儲(chǔ)的是數(shù)據(jù)指針(指向包含鍵值的磁盤文件塊的指針),與該鍵值一起存儲(chǔ)在B-樹的結(jié)點(diǎn)中。這就會(huì)導(dǎo)致可以存儲(chǔ)在 B-樹中的結(jié)點(diǎn)目數(shù)極大地減少了,從而增加 B-樹的層數(shù),進(jìn)而增加了記錄的搜索時(shí)間。
B+樹通過僅在樹的葉子結(jié)點(diǎn)中存儲(chǔ)數(shù)據(jù)指針而消除了上述缺陷。因此,B+樹的葉結(jié)點(diǎn)的結(jié)構(gòu)與 B-樹的內(nèi)部結(jié)點(diǎn)的結(jié)構(gòu)完全不同。在這里應(yīng)該注意,由于數(shù)據(jù)指針僅存在于葉子結(jié)點(diǎn)中,因此葉子結(jié)點(diǎn)必須將所有鍵值及其對(duì)應(yīng)的數(shù)據(jù)指針存儲(chǔ)到磁盤文件塊以便訪問。此外,葉子結(jié)點(diǎn)被鏈接磁盤的某個(gè)位置,以提供對(duì)記錄的有序訪問。因此,葉子結(jié)點(diǎn)形成名列前茅級(jí)索引,而內(nèi)部結(jié)點(diǎn)形成多層索引的其他層。葉子結(jié)點(diǎn)的某些關(guān)鍵字 key 也出現(xiàn)在內(nèi)部結(jié)點(diǎn)中,充當(dāng)控制搜索記錄的媒介。
與 B-樹不同,B+樹中的結(jié)點(diǎn)存在兩個(gè)階(order):對(duì)于階 “a” 和 “ b”,一個(gè)用于內(nèi)部結(jié)點(diǎn),另一個(gè)用于外部(或葉)結(jié)點(diǎn)。
延伸閱讀:
二、B+樹的優(yōu)點(diǎn)
同為h層的 B-樹和 B+樹,B+樹可以存儲(chǔ)更多的結(jié)點(diǎn)元素,更加 ”矮胖“。這也是 B+樹最大的優(yōu)勢坐在,極大地改善了 B-樹的查找效率。對(duì)于同樣多的記錄,B+樹的高度會(huì)更矮,并且指針的出現(xiàn)可以幫助 B+樹快速訪問磁盤記錄且效率非常高??傊褪?B+樹比 B-樹更加好,B+樹的磁盤 I / O 會(huì)更少,相比于 B-樹的中序遍歷,B+樹只需要像遍歷單鏈表一樣掃描一遍葉子結(jié)點(diǎn)。