1,最小存儲(chǔ)單元
1)磁盤(pán)扇區(qū):
磁盤(pán)的最小存儲(chǔ)單元,默認(rèn)512字節(jié)尘分。
2)文件系統(tǒng)最小單位塊(機(jī)械硬盤(pán)一個(gè)扇區(qū)512字節(jié),SSD固態(tài)硬盤(pán)使用4K對(duì)齊按照4K扇區(qū)規(guī)則寫(xiě)入數(shù)據(jù)
)丸氛。4k = 8個(gè)扇區(qū)培愁。盡管一個(gè)文件只有1個(gè)字節(jié),仍然占用4k空間缓窜。
image.png
3)innodb_page_size:InnoDB引擎最小的存儲(chǔ)單位定续,頁(yè)谍咆。4k、8k香罐、16k=4個(gè)文件塊(默認(rèn))
image.png
引用一張InnoDB頁(yè)結(jié)構(gòu)圖
image.png
4)mysql InnoDB.ibd文件(索引和數(shù)據(jù)文件)的大小始終是16k的倍數(shù)卧波。
image.png
5)InnoDB引擎-文件系統(tǒng)-磁盤(pán)扇區(qū)關(guān)系
image.png
2,InnoDB數(shù)據(jù)組織與查詢(xún)
1)InnoDB最小存儲(chǔ)單位是頁(yè)庇茫。
16k港粱,葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)最小單位都是頁(yè)。B+樹(shù)中葉子節(jié)點(diǎn)存放數(shù)據(jù)(葉子節(jié)點(diǎn)間指針相連旦签,適用于局部性原理)查坪,非葉子節(jié)點(diǎn)存放關(guān)鍵字+指針。
2)InnoDB中頁(yè)指針6B宁炫,主鍵bigint占用8B偿曙。
image.png
3)數(shù)據(jù)查詢(xún)通過(guò)非葉子節(jié)點(diǎn)的二分查找,以及數(shù)據(jù)頁(yè)指針羔巢,找到具體的數(shù)據(jù)望忆。
4)二級(jí)索引檢索
image.png
5)B+樹(shù)的優(yōu)勢(shì)(B代表平衡,而非binary
)
對(duì)比B樹(shù):B樹(shù)葉子和非葉子都存數(shù)據(jù)竿秆,導(dǎo)致非葉子節(jié)點(diǎn)指針變少启摄,樹(shù)的高度增加。I/O操作變多幽钢,性能變低歉备。
對(duì)比ALV樹(shù):樹(shù)的深度更深,I/O操作多匪燕。維護(hù)平衡二叉樹(shù)需要左旋蕾羊、右旋保持平衡,代價(jià)很大帽驯。
3龟再,InnoDB樹(shù)的高度計(jì)算
1)假設(shè)如下:
數(shù)據(jù)記錄大小1KB
->葉子節(jié)點(diǎn)(頁(yè))可以存 16/1 = 16條數(shù)據(jù)
關(guān)鍵字和指針bigint 8B + 頁(yè)指針6B
->非葉子節(jié)點(diǎn)可以存 16384/14 = 1170個(gè)對(duì)象(關(guān)鍵字-頁(yè)指針)
2)高度為2和3的B+樹(shù)
高度為2的B+樹(shù):1170 * 16 = 18720,約存2w條數(shù)據(jù)記錄尼变。
高度為3的B+樹(shù):1170 * 1170 * 16 = 21902400吸申,約存2千萬(wàn)條數(shù)據(jù)記錄。
所以:InnoDB中B+樹(shù)的高度一般為1~3層享甸。mysql查找一頁(yè)時(shí)代表一次IO截碴,通過(guò)主鍵索引只需要1~3次IO。
3)InnoDB表空間ibd文件中蛉威,約定page_no為3的日丹,代表主索引的root page.
image.png
4)root page_no偏移量64位置(在ibd文件中的偏移量為16384 * 3 + 64 = 49216
)的前2個(gè)字節(jié),存放了B+樹(shù)的高度蚯嫌。page level
hexdump:查看二進(jìn)制文件的16進(jìn)制編碼哲虾。-n 10輸出前10個(gè)字節(jié)丙躏。-s 49216從該位置偏移量開(kāi)始。
test_tx的page level 為0:test_tx B+樹(shù)的高度為1