vlambda博客
学习文章列表

如何查看MySQL表中指定索引的高度

查看表中指定索引的高度:


索引层数的表示法:


索引中每个页的结构图:


page Header中有个page level的值,这个值保存这个B+树的高度值,由于B+树从0开始算,所以B+树的高度=page level的值再加1

由于B+树中是从root页开始查找数据,而root页中的page header中的page level中存储这颗B+树的高度值,所以下面需要查找到指定索引的root页的page_no


查找索引树中的root页的位置:

查看指定表索引对应的 space 和root页的page_no

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 b.name like 'employees/%';

+--------------------------------+------------+----------+------+-------+---------+

| name                           | name       | index_id | type | space | page_no |

+--------------------------------+------------+----------+------+-------+---------+

| employees/departments          | PRIMARY    |       59 |    3 |    35 |       3 |

| employees/departments          | dept_name  |       60 |    2 |    35 |       4 |

| employees/dept_emp             | PRIMARY    |       64 |    3 |    37 |       3 |

| employees/dept_emp             | emp_no     |       65 |    0 |    37 |       4 |

| employees/dept_emp             | dept_no    |       66 |    0 |    37 |       5 |

| employees/dept_manager         | PRIMARY    |       61 |    3 |    36 |       3 |

| employees/dept_manager         | emp_no     |       62 |    0 |    36 |       4 |

| employees/dept_manager         | dept_no    |       63 |    0 |    36 |       5 |

| employees/employees            | PRIMARY    |      125 |    3 |    83 |       3 |

| employees/employees_cmp        | PRIMARY    |      136 |    3 |   110 |       3 |

| employees/employees_compress   | PRIMARY    |      134 |    3 |   108 |       3 |

| employees/employees_compress_1 | PRIMARY    |      141 |    3 |   125 |       3 |

| employees/salaries             | PRIMARY    |       69 |    3 |    39 |       3 |

| employees/salaries             | emp_no     |       70 |    0 |    39 |       4 |

| employees/salaries             | idx_salary |      142 |    0 |    39 |     143 |

| employees/titles               | PRIMARY    |       67 |    3 |    38 |       3 |

| employees/titles               | emp_no     |       68 |    0 |    38 |       4 |

+--------------------------------+------------+----------+------+-------+---------+

 以上显示employees库中的表departments中的PRIMARY索引的space=35 page_no=3,page_no表示这个索引对应的root页号


通过hexdump工具来查看索引高度

[root@node232 ~]# hexdump --help

hexdump:无效选项 -- -

hexdump: [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]

参数:

        -s:从偏移量多少开始

        -n:读取多少个字节

        

hexdump -s 16384*3+64 -n 2 


        16384*3表示从第3个页开始位置开始读

        64表示:每个页中64bytes的位置存储的就是page level的值


[root@node232 employees]# hexdump -s 49216 -n 2 -C /usr/local/mysql/data/employees/departments.ibd

0000c040  00 00                                             |..|

0000c042

        其中:00 00 表示索引高度只有一层,因为没有数据

查看表departments数据量:

(root@DB)[employees]> select count(*) from departments;

+----------+

| count(*) |

+----------+

|        9 |

+----------+

1 row in set (0.04 sec)


[root@node232 employees]# hexdump -s 49216 -n 2 -C /usr/local/mysql/data/employees/employees.ibd

0000c040  00 01                                             |..|

0000c042

        其中:00 01 表示索引高度只有两层


查看表employees的数据量:

(root@DB)[employees]> select count(*) from employees;

+----------+

| count(*) |

+----------+

|   300024 |

+----------+

1 row in set (0.77 sec)