基于 Mysql5.7

一、回顾 InnoDB 逻辑结构图

image.png
“段”对应的就是上图中的”segment“。

二、段(segment)

为了提高查询扫描效率,InnoDB 将B+树的叶子节点和非叶子节点进行了区别对待。
存放叶子节点有自己专门的区,这些区的集合就算是一个段(segment),叫做叶子节点段。
存放非叶子节点有自己专门的区,这些区的集合也算是一个段(segment),叫做非叶子节点段。
也就是说,对于一个索引会产生两个段:叶子节点段、非叶子节点段。

InnoDB 中数据即索引,索引即数据

段中的区

一个段由多个区组成,而extent(区)大体上可以分为四种类型:

  • 空闲的区:该区的任何页面还未被使用
  • 有剩余空间的碎片区:碎片区中还有可用的页面。
  • 没有剩余空间的碎片区:碎片区中的所有页面已经被使用完了。
  • 附属于某个段的区:每一个索引都可以分为:叶子节点段和非叶子节点段。InnoDB 还有其他特殊的段在数据量大时会使用区作为基本单位。

四种类型的 extent(区) 中,只有附属于某个段的区是 segment(段)独有的。

如何为段分配空间

step1、刚开始往表中插入数据,段是从某个碎片区以单页面为单位分配空间
step2、单独给某个段已经占用了32个碎片区的页面后,为段分配单独完整的区。