考慮表結(jié)構(gòu)如下: create table testzh(id int primary key auto_increment ,id2 int,id3 int); 插入數(shù)據(jù): delimiter // create procedure ins3() begin declare i int; set i=0; while i<10000 do insert into testzh(id2,id3) values(FLOOR((RAND()*100000)),FLOOR((RAND()*100000))); set i=i+1; end while; end; // delimiter ; 這里僅僅考慮聚合索引的B+數(shù)結(jié)構(gòu)。 首先我們要考慮2個(gè)因素: 1、分支節(jié)點(diǎn)如何存儲(chǔ)一行數(shù)據(jù) 2、葉子結(jié)點(diǎn)如何存儲(chǔ)一行數(shù)據(jù) 位了找到這個(gè)問題我們必須要找到哪些塊是葉子結(jié)點(diǎn),哪些塊是非葉子結(jié)點(diǎn),這里使用自己寫的一個(gè)程序 找到詳細(xì)參考最后的代碼 (http://blog.itpub.net/7728585/viewspace-2128817/) [root@testmy test]# ./t1 testzh.ibd file size is 442368 Block id is 3:Index page no is 552 : B+ Tree Level is 1 Block id is 4:Index page no is 552 : B+ Tree Level is 0 Block id is 5:Index page no is 552 : B+ Tree Level is 0 Block id is 6:Index page no is 552 : B+ Tree Level is 0 Block id is 7:Index page no is 552 : B+ Tree Level is 0 Block id is 8:Index page no is 552 : B+ Tree Level is 0 Block id is 9:Index page no is 552 : B+ Tree Level is 0 ..... 可以看到在這個(gè)文件中block_id = 3的是非葉子結(jié)點(diǎn) 其他的塊是葉子結(jié)點(diǎn)。 那我們來研究第一個(gè)問題 1、分支節(jié)點(diǎn)如何存儲(chǔ)一行數(shù)據(jù) 其實(shí)這個(gè)問題答案就是 6字節(jié)固定開銷+4字節(jié)(int數(shù)據(jù)類型4字節(jié))+4字節(jié)(指向葉子結(jié)點(diǎn)的指針開銷) 我們知道每個(gè)數(shù)據(jù)庫塊的前120直接是管理固定開銷如: FILE HEADER,INDEX HEADER等 在塊尾部也有8字節(jié)的固定開銷 那么我們從offset 120開始向后面數(shù)14個(gè)字節(jié),這里也要使用我自己寫的工具 bcview 方便查看 ./bcview testzh.ibd 16 120 14 current block:00000003--Offset:00120--cnt bytes:14--data is:00100011000e8000000100000004 得到數(shù)據(jù): 00100011000e8000000100000004 分析一下: 00100011000e8000000100000004 固定開銷(6字節(jié)) 00 nullable field bitmap (?) 10 info flags+number of records owned 0011 order+ record type (0000 0000 0001 0001) 000e 下一個(gè)偏移量 --可變開銷(實(shí)際數(shù)據(jù)4字節(jié)) 80000001 (實(shí)際主鍵數(shù)據(jù)1其中8是符號(hào)位) --固定開銷(4字節(jié)) 00000004 (葉子結(jié)點(diǎn)block指針) 我們可以看到這是非葉子結(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)的格式如此,除了4字節(jié)的主鍵外,這里包含了10字節(jié)的額外開銷。 2、葉子結(jié)點(diǎn)如何存儲(chǔ)一行數(shù)據(jù) 接下來我們來看一下這個(gè)表的每一行數(shù)據(jù)是如何存放的,二進(jìn)制如下: ./bcview testzh.ibd 16 120 31 current block:00000004--Offset:00120--cnt bytes:31--data is:00000010001f800000010000004d1995cd000001440110800046cd80000683 00 nullable field bitmap(?) 00 info flags+number of records owned 0010 order+record type 001f 下一個(gè)偏移量 80000001 (實(shí)際主鍵id數(shù)據(jù)1其中8是符號(hào)位) 0000004d1995 transaction id cd000001440110 roll pointer 800046cd (實(shí)際數(shù)據(jù)id2:18125 8是符號(hào)位) 80000683 (實(shí)際數(shù)據(jù)id2:1667 8是符號(hào)位) 實(shí)際上就是31個(gè)字節(jié) 那么我們很容易計(jì)算出來如果滿存儲(chǔ)行大約(16*1024-128(塊頭塊尾部))/31 = 524 行數(shù)據(jù)。當(dāng)然實(shí)際上存儲(chǔ)達(dá)不到這個(gè)值受到 B+樹分裂行為以及填充因子等限制實(shí)際上到不了這個(gè)值,我這里去大約500行數(shù)據(jù) 好了對(duì)于這張表這里我們可以實(shí)際大約計(jì)算一下理論值,實(shí)際值將略�。� 一層B+樹 最大16K空間 約500行數(shù)據(jù) 二層B+樹 最大約18M空間((16*1024-128)/14 * 16/1024 ) 約58000行數(shù)據(jù)((16*1024-128)/14 *500) 三層B+樹 最大約21000M空間(power((16*1024-130)/14,2) * 16/1024) 約673960500行數(shù)據(jù)(power((16*1024-130)/14,2) * 500) 四層B+樹 最大約24452000M空間(power((16*1024-130)/14,3) * 16/1024) 約782468140500行數(shù)據(jù)(power((16*1024-130)/14,3) * 500) 但是要注意這里最大空間受到主鍵選擇影響很大,如果不是int為主鍵那么其非葉子結(jié)點(diǎn)一行數(shù)據(jù)將不會(huì)是14字節(jié)如果是long類型將是18字節(jié),那么最大空間 將不會(huì)達(dá)到這么大,而行數(shù)更是受到實(shí)際一行數(shù)據(jù)大小限制,這里只是以文章開頭建立的表為列子。 |
免責(zé)聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識(shí),文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請(qǐng)勿用于商業(yè)用途,如果損害了您的權(quán)利,請(qǐng)聯(lián)系我們及時(shí)修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級(jí),為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務(wù),與站長一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!
掃一掃,關(guān)注站長網(wǎng)微信