一般索引树的高度在 3~4 层之间,但是 InnoDB 并没有提供相应的视图进行查看,但只要明白 InnoDB 索引的内部构造,就能迅速得出索引的高度。
先来看张图:
叶子节点是存在叶子节点段中的,非叶节点是在非叶节点段中的,每一个索引都是由这两个段组成的。
InnoDB 是索引组织表,每个页都包含一个 PAGE_LEVEL 的信息(见上图右半部分),用于表示当前页所在索引中的高度。默认叶子节点的高度为 0,那么 Root 页的 PAGE_LEVEL + 1 就是这棵索引的高度。
接下去的问题就是怎样得到一张表所有索引的 Root 页所在的位置呢?
其实官方提供了内部视图来查看每个索引的 Root 页,通过下面的 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;
运行上述的 SQL 语句应该可以得到类似如下的结果:
其中 (SPAE,PAGE_NO)就是索引的 Root 页。
有了这些信息就可以方便的定位 PAGE_LEVEL 了,因为 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 = 8K,并非默认的 16K),即第 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。
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/vsds8h 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。