A:我们在操作一条记录的时候就是在操作数据页,虽然同一层的数据页通过双向链表链接,但是如果两个数据页的物理位置隔得很远的话,就变成了随机I/O,当我们在使用范围查询时,效率十分的低。
为了可以使用顺序I/O,我们应该尽量使链表中相邻的页在物理上也相邻,为了达到这一目的,就有了区的概念
区:连续的64个页组成一个区,没256个区被划分为1组
A:如果我们把叶子结点和非叶子节点都放在同一个区的话,那么在进行范围查询的时候效率会大打折扣,因为非叶子节点并不会被范围扫,所以MySQL设计者提出了段的概念,一个索引分为两个段,叶子结点放在一个段,非叶子结点放在另外一个段。段以区为单位申请空间。
这样带来的问题:因为段以区为单位申请空间,所以一个段至少1M,但是有的索引它并不会有这么多数据,为了防止这种浪费,设计者又提出了碎片区——碎片区中的页不专存储某一个段中的数据,它其中一部分页可以服务段A,一部分页可以服务段B。
基于碎片区的概念,段申请资源的过程就变成了:当我们向表中插入数据时,先使用碎片区中的页,当我们使用到了32个碎片区的页后,就会申请一个完整的区用来存储我们该索引中的数据。
我们有各种各样的区,为了方便管理,设计者提出了一个XDES Entry的结构,每一个区对应一个XDES Entry结构,这个结构如下: