Mysql ——区、段、表空间 、碎片区( 二 )


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

文章插图
所以此后为某个段分配存储空间的策略是这样的:
。在刚开始向表中插入数据的时候,段是从某个碎片区以单个页面为单位来分配存储空间的.
。当某个段已经占用了32个碎片区 页面之后,就会申请以完整的区为单位来分配存储空间 。
所以现在段不能仅定义为是某些区的集合,更精确的应该是 某些零散的页面 以及 一些完整的区 的集合 。
2.4 区的分类
区大体上可以分为4种类型:
处于FREE、 以及这三种状态的区都是独立的,直属于表空间 。而处于FSEG 状态的区是附属于某个段的 。
如果把表空间比作是一个集团军,段就相当于师,区就相当于团 。一般的团都是隶属于某个师的,就像是处于FSEG的区全都隶属于某个段,而处于FREE、 以及这三种状态的区却直接隶属于表空间,就像独立团直接听命于军部一样 。
3、表空间
表空间可以看做是存储引擎逻辑结构的最高层,所有的数据都存放在表空间中 。
表空间是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间 。表空间数据库由一个或多个表空间组成,表空间从管理上可以划分为 系统表空间 () 、独立表空间 (File-per-table ) 、撤销表空间 (Undo ) 和临时表空间( ) 等 。
3.1 独立表空间
独立表空间,即每张表有一个独立的表空间,也就是数据和索引信息都会保存在自己的表空间中 。独立的表空间(即:单表)可以在不同的数据库之间进行迁移 。
空间可以回收(DROP TABLE 操作可自动回收表空间,其他情况,表空间不能自己回收) 。如果对于统计分析或是日志表,删除大量数据后可以通过: alter table=; 回收不用的空间 。对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理 。
独立表空间结构
独立表空间由段、区、页组成 。前面已经讲解过了 。
真实表空间对应的文件大小
我们到数据目录里看,会发现一个新建的表对应的.ibd 文件只占用了 96K,才6个页面大小(.7中),这是因为一开始表空间占用的空间很小,因为表里边都没有数据 。不过别忘了这些ibd文件是 自扩展的,随着表中数据的增多,表空间对应的文件也逐渐增大 。
mysql 8.0之后,frm文件和 ibd文件已经合并,新建一个表对应是7个页的大小
查看的表空间类型:
产看是否使用了独立表空间
mysql> show variables like 'innodb_file_per_table';
你能看到 e=ON,这就意味着每张表都会单独保存为一个 ibd 文件 。
【Mysql ——区、段、表空间 、碎片区】3.2 系统表空间
系统表空间的结构和独立表空间基本类似,只不过由于整个MySQL进程只有一个系统表空间,在系统表空间中会额外记录一些有关整个系统信息的页面,这部分是独立表空间中没有的 。
数据字典
每当我们向一个表中插入一条记录的时候,MySQL校验过程 如下
先要校验一下插入语句对应的表存不存在,插入的列和表中的列是否符合,如果语法没有问题的话,还需要知道该表的聚簇索引和所有二级索引对应的根页面是哪个表空间的哪个页面,然后把记录插入对应索引的B+树中 。所以说,MySQL除了保存着我们插入的用户数据之外,还需要保存许多额外的信息,比方说:
- 某个表属于哪个表空间,表里边有多少列
- 表对应的每一个列的类型是什么