如何知道btree樹的高度


來自網絡,總結到這里:

當我想看btree樹高度的時候,篩選出來這篇文章"為什么 B-tree 在不同著作中度的定義有一定差別?",知道了高度的算法是這個公式:但是里面又提高t和出度有關系,那么這個出度怎么算呢?為此我又搜索到了這里:"B-/+Tree索引的性能分析", d越大索引的性能越好,而出度的上限取決於節點內key和data的大小:

dmax=floor(pagesize/(keysize+datasize+pointsize))

floor表示向下取整。

這篇文章也非常好,但是沒有一個明確的方法告訴我innodb的高度怎么看,我被老大說中了,“現在是一個快餐時代”,我也不例外,直到我看到這里:

通過下面的SQL語句可以查出某這表對應索引的Root頁:

SELECT b.name, a.name, index_id, type, a.space, a.PAGE_NO
FROM information_schema.INNODB_SYS_INDEXES a,
information_schema.INNODB_SYS_TABLES b
WHERE a.table_id = b.table_id AND a.space <> 0;
或者:
SELECT b.name, a.name, index_id, type, a.space, a.PAGE_NO
FROM information_schema.INNODB_SYS_INDEXES a,
information_schema.INNODB_SYS_TABLES b
WHERE a.table_id = b.table_id AND a.space <> 0 and name='dbname\/tbname';

運行上述的SQL語句應該可以得到類似如下的結果:

其中(SPAE,PAGE_NO)就是索引的Root頁。

關於上面的列都是什么意思?

 

有了這些信息就可以方便的定位啦,因為PAGE_LEVEL在每個頁的偏移量64位置出,占用兩個字節,通過hexdump這樣的工具就可以快速定位到所需要的樹高度信息:

root@test-1:~# hexdump -s 24640 -n 10 customer.ibd
00006040 00 02 00 00 00 00 00 00 00 47

查看customer表,24640表示的是3*8192+64(這里innodb_page_size,查看方法:

mysql -uroot -e"show global variables like 'innodb_page_size'"; 

設置為了8192,並非默認的16384),即第3個頁偏移量64位置開始讀取10個字節,但不是讀取2個字節就可以了嘛?其實因為后面8個字節對應的是index_id,就是上圖中看到的index為71的索引,這里PAGE_LEVEL為00 02,那么索引的高度就為3。

用同樣的方法可以查看customer表中i_c_nationkey的索引高度:

root@test-1:~# hexdump -s 32832 -n 10 customer.ibd
00008040 00 01 00 00 00 00 00 00 00 48

可以發現PAGE_LEVEL為00 01,表示這棵二級索引樹的高度為2。

雖然通常來說索引樹的高度為3~4層,但是極端情況下,比如數據量超級大,頁比較小,如4K,那么高度也是可能破4的。

參考來源:

https://dev.mysql.com/doc/refman/5.6/en/innodb-sys-indexes-table.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM