首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

innodb_ruby:窥探InnoDB奥秘的神器

一个InnoDB文件的解析工具,通过解析InnoDB文件,可以窥探其中很多的奥秘,绝对是一款非常优秀,高逼格的研究InnoDB的工具。但是作者不建议在生产环境使用,因为肯定有BUG,O(∩_∩)O哈哈~,作者写这个工具的主要目的是作为一个学习研究InnoDB的工具。

github地址

Github地址:https://github.com/jeremycole/innodb_ruby

安装

安装比较简单,执行命令即可。安装完成后,执行如下命令验证innodb_ruby是否安装成功:

如果提示ruby版本过低,从淘宝ruby镜像中下载高版本编译安装即可:

建议安装1.9.3-p551版本,因为当我安装了2.2.10版本的ruby后,执行innodb_space还是得到这样的错误信息:/usr/lib/ruby/gems/1.8/gems/bindata-2.4.3/lib/bindata.rb:5: BinData requires ruby >= 1.9.3。相关issue地址:https://github.com/jeremycole/innodb_ruby/issues/40。另外,安装ruby时,一步一步来,确保make以及make install时没有任何error信息。

准备数据

创建表插入数据之前,检查MySQL环境,MySQL建议5.5以上的版本,并且属性值:innodb_file_per_table=ON,innodb_file_format=Barracuda。接下来创建一张表,并借助存储过程插入一些数据:

用法示例

查看索引信息--name为索引名称,fseg为leaf表示属于叶子页的segment:

命令中的/data/mysql是mysql的datadir,yyfax_afei是数据库名称,t_afei是表名称。建议切换到$目录下,那么执行命令时-T的值为即可。

index-level-summary

得到指定level的所有page信息:

我们知道level值和索引树的高度是强相关的(叶子节点的level都是0),所以通过这个命令也可以知道InnoDB索引树高度。由上面执行命令的结果可知,level=3时没有任何数据,而level等于1和2都有,所以示例100w数据的表的索引树高度是3。

space-page-type-regions

统计相同类型页的连续空间,如下所示,start/end表示起始页,count总计占的页数。

通过结果可知,page为0,1,2类型名称分别是:FSP_HDR, IBUF_BITMAP, INODE。从page=3开始才是存放行数据和指针的页。

index-recurse

递归一个索引需要依赖一个ruby脚本文件simple_t_describer.rb,脚本内容如下:

执行如下命令:

这条命令会从root开始,全表扫描,以升序的方式遍历整个B+Tree索引树,遍历过程中会输出每个page以及指针的信息,包括叶子页和非叶子页,由于输出结果行过大(稍微大于表的行数),所以将结果重定向到一个recurseindex.log文件中:

从结果可知,ROOT NODE即根节点是page=3的页。通过space-page-type-regions的分析可知,0,1,2这三个page类型是FSP_HDR, IBUF_BITMAP, INODE。其他的就是INTERNAL节点和LEAF节点。

page-records

统计某一页中的数据。以刚才的结果为例,page=3是root页,这个page的数据如下,由结果可知,page=3有两个record,与recurseindex.log的结果是吻合的(ROOT NODE #3: 2 records, 26 bytes):

从这个结果也能看出来,root页是不保存具体数据,只保存主键索引的值和指针。

我们再从recurseindex.log中找几个LEAF节点,如下所示,page=1770,1771这些都是LEAF节点:

其中,page=1770的部分数据如下,一个页大概能574条记录,而page=1774还没有填满,只有379条数据:

从这个结果也能看出来,叶子页会保存具体数据,不只是主键,非主键其他列(num列)的数据也有保存。

tree height

根据通过innodb_space得到的结果,我们大概能计算出索引树的高度,假设树的高度是h:

百万级数据量的表,574^h=1000000。即h=2.17,所以百万级数据量且主键是int类型的表的索引树高度是3。

十万级数据量的表,574^h=100000。即h=1.81,所以十万级数据量且主键是int类型的表的索引树高度是2。

下面是笔者对一张十万数据量的表做得测试,通过结果可以看出level=0或者1都有结果,level=2没有结果,所以索引树高度是2:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181221G0K5JT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券