一、Mysql 5.7高度计算
1. 从视图查询计算索引树高度表的索引存储信息
mysql> SELECT b.name, a.name, index_id, a.PAGE_NO FROM information_schema.INNODB_SYS_INDEXES a join informattion_schema.INNODB_SYS_TABLES b on a.table_id = b.table_id where b.name='mirror/FLEX_RF_RESULT_2022_05_022'; +----------------------------------+-----------------------+----------+---------+ | name | name | index_id | PAGE_NO | +----------------------------------+-----------------------+----------+---------+ | mirror/FLEX_RF_RESULT_2022_05_02 | GEN_CLUST_INDEX | 110 | 3 | | mirror/FLEX_RF_RESULT_2022_05_02 | FLEX_RF_RESULT_PIDX01 | 111 | 4 | | mirror/FLEX_RF_RESULT_2022_05_02 | FLEX_RF_RESULT_PIDX02 | 112 | 5 | +----------------------------------+-----------------------+----------+---------+ 3 rows in set (0.00 sec)
index_id:索引的标识符。索引标识符在实例中的所有数据库中都是唯一的。
PAGE_NO:索引 B 树的根页码,比如为5,则为这个表是从page5 开始算起的
2.计算高度:
主要使用的命令为:hexdump
1)找到表的ibd文件
[root@mes_rf mirror]# hexdump -s 81984 -n 10 FLEX_RF_RESULT_2022_05_02.ibd 0014040 0200 0000 0000 0000 7000 001404a
-s 跳过多少开始计算page
-n 一共取多少字节,因为一个page_level(2字节),一个page_index_id(8字节)一共取十个字节
-s 81984=5*16*1024+64
5:代表从5以后开始计算(前面的0 1 2 3 4页不包含)
16 :一个页16KB
1024: KB和字节换算
64:一个page的前64字节不算
得到的结果:
0014040 0200 0000 0000 0000 7000
001404a
主要看0020代表索引树高度:因为mysql为16进制,所以0200代表:3层索引树,因为索引树从0算起,0 1 2 中间的0000 0000 0000 不用看,7000换算成10进制为112刚好和index_id一样,说明查询的是对的。
3.mysql8.0的索引树计算高度方法一样
区别:查询的视图表有区别
select b.NAME, a.NAME, a.INDEX_ID, a.PAGE_NO from information_schema.innodb_indexes as a join information_schema.innodb_tables as b on a.table_id=b.table_id where b.name='test/t100w';
其他计算方法一样