为什么MySQL索引更适合B+树而不是二叉树、B树
一 數(shù)據(jù)庫(kù)為什么使用B+樹(shù)
1. 與二叉樹(shù)相比
二叉樹(shù)相比于順序查找的確減少了查找次數(shù),但是在最壞情況下,二叉樹(shù)有可能退化為順序查找。而且就二叉樹(shù)本身來(lái)說(shuō),當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)量特別大時(shí),其層數(shù)也將特別大。二叉樹(shù)的高度一般是log_2^n,B樹(shù)的高度是log_t^((n+1)/2) + 1,其高度約比B樹(shù)大lgt倍。n是節(jié)點(diǎn)總數(shù),t是樹(shù)的最小度數(shù)。
假如每個(gè)盤(pán)塊可以正好存放一個(gè)B樹(shù)的結(jié)點(diǎn)(正好存放2個(gè)文件名)。那么一個(gè)BTNODE結(jié)點(diǎn)就代表一個(gè)盤(pán)塊,而子樹(shù)指針就是存放另外一個(gè)盤(pán)塊的地址。
下面,咱們來(lái)模擬下B樹(shù)索引查找文件29的過(guò)程:
- 根據(jù)根結(jié)點(diǎn)指針找到文件目錄的根磁盤(pán)塊1,將其中的信息導(dǎo)入內(nèi)存。【磁盤(pán)IO操作 1次】
- 此時(shí)內(nèi)存中有兩個(gè)文件名17、35和三個(gè)存儲(chǔ)其他磁盤(pán)頁(yè)面地址的數(shù)據(jù)。根據(jù)算法我們發(fā)現(xiàn):17<29<35,因此我們找到指針p2。
- 根據(jù)p2指針,我們定位到磁盤(pán)塊3,并將其中的信息導(dǎo)入內(nèi)存。【磁盤(pán)IO操作 2次】
- 此時(shí)內(nèi)存中有兩個(gè)文件名26,30和三個(gè)存儲(chǔ)其他磁盤(pán)頁(yè)面地址的數(shù)據(jù)。根據(jù)算法我們發(fā)現(xiàn):26<29<30,因此我們找到指針p2。
- 根據(jù)p2指針,我們定位到磁盤(pán)塊8,并將其中的信息導(dǎo)入內(nèi)存。【磁盤(pán)IO操作 3次】
此時(shí)內(nèi)存中有兩個(gè)文件名28,29。根據(jù)算法我們查找到文件名29,并定位了該文件內(nèi)存的磁盤(pán)地址。
2. 與B樹(shù)相比
B樹(shù)在提高IO性能的同時(shí),并沒(méi)與解決元素遍歷時(shí)效率低下的問(wèn)題,正是為了解決這個(gè)問(wèn)題,B+數(shù)應(yīng)運(yùn)而生。B+數(shù)只需遍歷葉子節(jié)點(diǎn)即可實(shí)現(xiàn)整棵樹(shù)的遍歷,而B(niǎo)樹(shù)必須使用中序遍歷按序掃庫(kù),B+樹(shù)支持范圍查詢(xún)非常方便。這才是數(shù)據(jù)庫(kù)選用B+樹(shù)的主要原因。
另外,最后說(shuō)一下,并不是說(shuō)B+樹(shù)就比B樹(shù)好,有很多基于頻率的搜索是選用B樹(shù),越頻繁query的結(jié)點(diǎn)越往根上走,前提是需要對(duì)query做統(tǒng)計(jì),而且要對(duì)key做一些變化。
無(wú)論是B樹(shù)還是B+樹(shù)由于前邊幾層反復(fù)query,因此早已被加載入內(nèi)存,不會(huì)出現(xiàn)讀磁盤(pán)IO。一般啟動(dòng)的時(shí)候,就會(huì)主動(dòng)換入內(nèi)存。在內(nèi)存中B+樹(shù)并沒(méi)有優(yōu)勢(shì),只有在磁盤(pán)中B+樹(shù)的威力才能顯現(xiàn)。
參考文獻(xiàn):
B樹(shù)高度計(jì)算
B+樹(shù)和B樹(shù)讀取磁盤(pán)過(guò)程
總結(jié)
以上是生活随笔為你收集整理的为什么MySQL索引更适合B+树而不是二叉树、B树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java开发常用命名规范
- 下一篇: ES建立索引步骤, 1,index 2.