基于 Mysql5.7
一、回顾 InnoDB 逻辑结构图
二、段(segment)
为了提高查询扫描效率,InnoDB 将B+树的叶子节点和非叶子节点进行了区别对待。
存放叶子节点有自己专门的区,这些区的集合就算是一个段(segment),叫做叶子节点段。
存放非叶子节点有自己专门的区,这些区的集合也算是一个段(segment),叫做非叶子节点段。
也就是说,对于一个索引会产生两个段:叶子节点段、非叶子节点段。
InnoDB 中数据即索引,索引即数据
段中的区
一个段由多个区组成,而extent(区)大体上可以分为四种类型:
- 空闲的区:该区的任何页面还未被使用
- 有剩余空间的碎片区:碎片区中还有可用的页面。
- 没有剩余空间的碎片区:碎片区中的所有页面已经被使用完了。
- 附属于某个段的区:每一个索引都可以分为:叶子节点段和非叶子节点段。InnoDB 还有其他特殊的段在数据量大时会使用区作为基本单位。
四种类型的 extent(区) 中,只有附属于某个段的区是 segment(段)独有的。
如何为段分配空间
step1、刚开始往表中插入数据,段是从某个碎片区以单页面为单位分配空间
step2、单独给某个段已经占用了32个碎片区的页面后,为段分配单独完整的区。

