來自網絡,總結到這里:
當我想看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