二级索引 以 B+树 形式保存在表空间(
以 页 为单位分配和存储数据,在 B+树 的每一层节点间形成的双向链表间的 物理位置 可能会很远,大量的 随机I/O 会降低查询存储效率,因此应该尽量让链表中相邻的页的 物理位置 也尽量相邻,这样 范围查询 的的时候进行 顺序I/O 可以大大提升效率,所以提出了 段 的概念,当表中的数据量大到一定程度(32个独立页面)后,再为索引分配空间就按照 区 来分配,
所谓 范围查询 就在索引的叶子节点中定位到最小值和最大值,然后顺序扫描
在 表空间 中,对16KB的页来说,连续的64个页就是一个 区(extent),占用1MB,不论是 系统表空间 还是 独立表空间 都可以看成是若干的 区 组成的,每256个区被划分成一个 组 (实际上因为InnoDB设计者想通过一个页面管理(存储)一些页面的元数据,受单张页面16KB大小的影响,除去其他必要元数据信息外(如:FileHeader,FileTrailer等)存储一个页面的元数据的 XDES Entry 需要40字节,故最多只能存储256个 XDES Entry 结构(256个区以后再使用一个新的页面去管理之后的256个区),最终就形成了以256个区为一个 组 作为一个管理单元(其实就是单页面的XDES的管理范围是256个区))
因为 范围查询 要顺序要扫描 B+树的 叶子节点 因此为了查询效率,将叶子节点和内节点分配的区,区别对待,存放叶子节点的区的集合为一个 段 (segment),存放内节点的区的集合为另一个 段,也就说一个索引有两个 段 一个 叶子节点段 ,一个 非叶子节点段 (内节点段)
段 是一个逻辑概念,刚开始插入数据,段是以 碎片区 的单个页面为单位来分配空间,当 段 占用了32个独立的碎片页面后,再分配空间就是以为完整的区为单位了,也就是说,段=碎片区页面+区;分为两个段是为了将叶子节点数据尽可能的顺序存储,减少 随机I/O