锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

简单理解Mysql Innodb引擎中的B+树

时间:2022-11-14 11:00:01 cj19b电容器接触器

到目前为止,作为绝大多数数数据库的主流——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可完成服务测试!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章