Mysql的一顆B+樹(shù)能存放多少數(shù)據(jù)?

答案:2000w左右

InnoDn的最小存儲(chǔ)單元

在計(jì)算機(jī)中磁盤存儲(chǔ)數(shù)據(jù)最小單元是扇區(qū),一個(gè)扇區(qū)的大小是512字節(jié),而文件系統(tǒng)(例如XFS/EXT4)他的最小單元是塊,一個(gè)塊的大小是4k,而對(duì)于我們的InnoDB存儲(chǔ)引擎也有自己的最小儲(chǔ)存單元——頁(yè)(Page),一個(gè)頁(yè)的大小是16K。

innodb的所有數(shù)據(jù)文件(后綴為ibd的文件),他的大小始終都是16384(16k)的整數(shù)倍。

InnoDb存儲(chǔ)結(jié)構(gòu)

InnoDB中主鍵索引B+樹(shù)是如何組織數(shù)據(jù)、查詢數(shù)據(jù)的,我們總結(jié)一下:

1、InnoDB存儲(chǔ)引擎的最小存儲(chǔ)單元是頁(yè),頁(yè)可以用于存放數(shù)據(jù)也可以用于存放鍵值+指針,在B+樹(shù)中葉子節(jié)點(diǎn)存放數(shù)據(jù)非葉子節(jié)點(diǎn)存放鍵值+指針。

2、索引組織表通過(guò)非葉子節(jié)點(diǎn)的二分查找法以及指針確定數(shù)據(jù)在哪個(gè)頁(yè)中,進(jìn)而在去數(shù)據(jù)頁(yè)中查找到需要的數(shù)據(jù);

計(jì)算

假設(shè)B+樹(shù)高為2,即存在一個(gè)根節(jié)點(diǎn)和若干個(gè)葉子節(jié)點(diǎn),那么這棵B+樹(shù)的存放總記錄數(shù)為:根節(jié)點(diǎn)指針數(shù)*單個(gè)葉子節(jié)點(diǎn)記錄行數(shù)。

葉子節(jié)點(diǎn)計(jì)算

上文我們已經(jīng)說(shuō)明單個(gè)葉子節(jié)點(diǎn)(頁(yè))中的記錄數(shù)=16K/1K=16。(這里假設(shè)一行記錄的數(shù)據(jù)大小為1k,實(shí)際上現(xiàn)在很多互聯(lián)網(wǎng)業(yè)務(wù)數(shù)據(jù)記錄大小通常就是1K左右)。

非葉子節(jié)點(diǎn)計(jì)算

那么現(xiàn)在我們需要計(jì)算出非葉子節(jié)點(diǎn)能存放多少指針,其實(shí)這也很好算,我們假設(shè)主鍵ID為bigint類型,長(zhǎng)度為8字節(jié),而指針大小在InnoDB源碼中設(shè)置為6字節(jié),這樣一共14字節(jié),我們一個(gè)頁(yè)中能存放多少這樣的單元,其實(shí)就代表有多少指針,即16384/14=1170。那么可以算出一棵高度為2的B+樹(shù),能存放1170*16=18720條這樣的數(shù)據(jù)記錄。

所以可以算出一個(gè)高度為3的B+樹(shù)可以存放:1170*1170*16=21902400條這樣的記錄。所以在InnoDB中B+樹(shù)高度一般為1-3層,它就能滿足千萬(wàn)級(jí)的數(shù)據(jù)存儲(chǔ)。在查找數(shù)據(jù)時(shí)一次頁(yè)的查找代表一次IO,所以通過(guò)主鍵索引查詢通常只需要1-3次IO操作即可查找到數(shù)據(jù)。

面試常見(jiàn)問(wèn)題:

1、一個(gè)B+樹(shù)能存儲(chǔ)多大數(shù)據(jù)量級(jí)?

一般3層的B+樹(shù)就能滿足2000w級(jí)的數(shù)據(jù)存儲(chǔ)需求,且查詢僅需1-3次IO操作;

2、為什么MySQL的索引要使用B+樹(shù)而不是其它樹(shù)形結(jié)構(gòu)?比如B樹(shù)?

(1)因?yàn)锽樹(shù)不管葉子節(jié)點(diǎn)還是非葉子節(jié)點(diǎn),都會(huì)保存數(shù)據(jù),這樣導(dǎo)致在非葉子節(jié)點(diǎn)中能保存的指針數(shù)量變少(有些資料也稱為扇出),指針少的情況下要保存大量數(shù)據(jù),只能增加樹(shù)的高度,導(dǎo)致IO操作變多,查詢性能變低;

(2)B樹(shù)的實(shí)現(xiàn)中,葉子節(jié)點(diǎn)與非葉子節(jié)點(diǎn)均存在具體的數(shù)據(jù),無(wú)法進(jìn)行范圍查詢,而B(niǎo)+樹(shù)的數(shù)據(jù)是存儲(chǔ)在葉子節(jié)點(diǎn)且通過(guò)鏈表的形式進(jìn)行組織,能夠?qū)崿F(xiàn)高效的數(shù)據(jù)范圍查詢;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容