简单理解Mysql Innodb引擎中的B+树
时间:2022-11-14 11:00:01
到目前为止,作为绝大多数数数据库的主流——Mysql越来越广泛地使用这篇文章。让我们简单计算一下Mysql5.7版本后,默认发动机Innodb使用B 树的基本分页机制。
B 树的优点是使用明显较小的层数来完成数据库数据的查询,而树的优点是Innodb默认分页大小为16kb,那么这个16kb影响的方面在哪里?
首先要了解每一页的内容,在整个数据底层,在非叶节点的情况下:
- file Header、Page Header等 102字节
- Infimum Supermum 13字节
- 记录头 5字节
- 索引类型(例:int为 4字节,longint为 8字节)
- 页面目录偏移量 4字节
非叶节点可以存储的记录数量 =(页大小-file Header - Page Header-...)/(记录头 主键 页偏移量) =(16kb-128b)/(5b 4b(int) 4b) =1250
然后是整个结构B 每层各叶节点的数量:
- 变长列表 1B
- 记录头 5B
- 数据 根据存储情况确定
- 事务ID 6B
- 回滚指针 7B
所以我们的三层通常有
存储在叶节点的数据记录 =(页大小-file Header - Page Header-...)/(主键 字段 下一条记录偏移量偏移量) =(16kb-128b)/(1b 5b 字段长度 6b 7b) =16246/(19b 字段长度)
从整个数据结构中很容易看出,如果要增加的话mysql中Innodb引擎的B 我们只能从三个数据入手:
页面大小、主键大小、字段长度
主键和字段是根据实际生产情况决定的,所以我们的mysql有没有办法修改页面大小来增加叶节点/非叶节点的数量?(虽然我们在实际生产中mysql3层B 大多数时候,树体积足以容纳数据,以下内容仅供简单参考)
遗憾的是,我们通常的手段是Mysql除非我们从根本的源码层面修改,否则没有修改页面大小的指令:
更改办法:
(以MySQL-5.1.38源码为例)
位置在storage/innobase/include/univ.i ,在univ.i中查找:UNIV_PAGE_SIZE
UNIV_PAGE_SIZE就是数据页大小,默认的是16K. 后面的注释表明,该值可以设置为必须为2的次方。该值可设置为4k,8k,16k,32K,64K,大也没意义。
同时更改了UNIV_PAGE_SIZE后需要更改 UNIV_PAGE_SIZE_SHIFT 值是2多少次?UNIV_PAGE_SIZE,完成这些部分后,重新启动Mysql可完成服务测试!