Mysql ——区、段、表空间 、碎片区

目录
1、页的上层结构
2、区、段 与碎片区
2.1、为什么要有区?
2.2 为什么要有段?
2.3 为什么要有碎片区?
2.4 区的分类
3、表空间
3.1 独立表空间
3.2 系统表空间
附录:数据页加载的三种方式
1.内存读取
2.随机读取
3.顺序读取
1、页的上层结构
2、区、段 与碎片区2.1、为什么要有区?
B+树的每一层中的页都会形成一个双向链表,如果是以页为单位 来分配存储空间的话,双向链表相邻的两个页之间的 物理位置可能离得非常远 。我们介绍B+树索引的适用场景的时候特别提到范围查询只需要定位到最左边的记录和最右边的记录,然后沿着双向链表一直扫描就可以了,而如果链表中相邻的两个页物理位置离得非常远就是所谓的 随机I/O 。再一次强调,磁盘的速度和内存的速度差了好几个数量级,随机I/O是非常慢 的,所以我们应该尽量让链表中相邻的页的物理位置也相邻,这样进行范围查询的时候才可以使用所谓的 顺序I/O 。
引入区的概念,一个区就是在物理位置上连续的64个页 。因为 中的页大小默认是 16KB,所以一个区的大小是 64*16KB= 1MB。在表中 数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照 区为单位分配,甚至在表中的数据特别多的时候,可以一次性分配多个连续的区 。虽然可能造成 一点点空间的浪费(数据不足以填充满整个区),但是从性能角度看,可以消除很多的随机IO,功大于过!
2.2 为什么要有段?
对于范围查询,其实是对B+树叶子节点中的记录进行顺序扫描,而如果不区分叶子节点和非叶子节点,统统把节点代表的页面放到申请到的区中的话,进行范围扫描的效果就大打折扣了 。所以 对 B+ 树的叶节点和叶子节点进行了区别对待,也就是说叶子节点有自己独有的区,非叶子节点也有自己独有的区 。存放叶子节点的区的集合就算是一个段(),存放非叶子节点的区的集合也算是一个段 。也就是说一个索引会生成2个段,一个 叶子节点段,一个非叶子节点段 。
除了索引的叶子节点段和非叶子节点段之外,中还有为存储一些特 殊的数据而定义的段,比如回滚段 。所以,常见的段有数据段、索引段、 回滚段 。数据段即为B+树的叶子节点,索引段即为B+树的非叶子节点 。
在存储引擎中,对段的管理都是由引擎自身所完成,DBA不能也没有必要对其进行控制 。这从一定程度上简化了DBA对于段的管理 。
段其实不对应表空间中某一个连续的物理区域,而是一个逻辑上的概念,由若干个零散的页面以及一些完整的区组成 。
2.3 为什么要有碎片区?
默认情况下,一个使用存储引擎的表只有一个聚簇索引,一个索引会生成2个段,而段是以区为单位申请存储空间的,一个区默认占用1M (64*16Kb = ) 存储空间,所以默认情况下一个只存了几条记录的小表也需要2M的存储空间么?以后每次添加一个索引都要多申请2M的存储空间么? 这对于存储记录比较少的表简直是天大的浪费 。这个问题的症结在于到现在为止我们介绍的区都是非常 纯粹 的,也就是一个区被整个分配给某一个段,或者说区中的所有页面都是为了存储同一个段的数据而存在的,即使段的数据填不满区中所有的页面,那余下的页面也不能挪作他用 。
为了考虑以完整的区为单位分配给某个段对于 数据量较小的表太浪费存储空间的这种情况,提出了一个碎片()区的概念 。在一个碎片区中,并不是所有的页都是为了存储同一个段的数据而存在的,而是碎片区中的页可以用于不同的目的,比如有些页用于段A,有些页用于段B,有些页甚至哪个段都不属于 。碎片区直属于表空间,并不属于任何一个段.