MySQL阅读笔记——7.InnoDB表空间

  二级索引B+树 形式保存在表空间(表名.ibd 文件),InnoDB为不同的页面设置的了不同的类型。这些类型记录在每个页面头部的 FIL_PAGE_TYPE位(两字节)

   为单位分配和存储数据,在 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

原文地址:https://www.cnblogs.com/leon618/p/13783299.html