转载:查看 InnoDB表中每个的索引高度

    一般索引树的高度在 3~4 层之间,但是 InnoDB 并没有提供相应的视图进行查看,但只要明白 InnoDB 索引的内部构造,就能迅速得出索引的高度。

    先来看张图:
    MEpoEwcicyJn13WJI96wc3DmOZGMh6Gic72ic7Ms8cM5mnJKztNaY2ibW6kJyPEVLicNAxicKIfxiblWzsYUjQofWUf6A.jpg
    叶子节点是存在叶子节点段中的,非叶节点是在非叶节点段中的,每一个索引都是由这两个段组成的。

    InnoDB 是索引组织表,每个页都包含一个 PAGE_LEVEL 的信息(见上图右半部分),用于表示当前页所在索引中的高度。默认叶子节点的高度为 0,那么 Root 页的 PAGE_LEVEL + 1 就是这棵索引的高度。

    接下去的问题就是怎样得到一张表所有索引的 Root 页所在的位置呢?

    其实官方提供了内部视图来查看每个索引的 Root 页,通过下面的 SQL 语句可以查出某张表对应索引的 Root 页:

    1. SELECT b.name, a.name, index_id, type, a.space, a.PAGE_NO
    2. FROM information_schema.INNODB_SYS_INDEXES a, information_schema.INNODB_SYS_TABLES b
    3. WHERE a.table_id = b.table_id
    4. AND a.space <> 0;

    运行上述的 SQL 语句应该可以得到类似如下的结果:
    图片.png
    其中 (SPAE,PAGE_NO)就是索引的 Root 页。

    有了这些信息就可以方便的定位 PAGE_LEVEL 了,因为 PAGE_LEVEL 在每个页的偏移量是 64,占用两个字节,通过 hexdump 这样的工具就可以快速定位到所需要的树高度信息:

    1. root@test-1:~# hexdump -s 24640 -n 10 customer.ibd
    2. 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 的索引高度:

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

    可以发现 PAGE_LEVEL 为 00 01,表示二级索引树的高度为 2。

    作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/vsds8h 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。