【MySQL】InnoDB引擎 —— 架构 —— 磁盘结构

接下来,再来看看InnoDB体系结构的右边部分,也就是磁盘结构:

image-20240720223239043

一、System Tablespace

系统表空间是Change Buffer(更改缓冲区)的存储区域。如果表是在系统表空间而不是每个表文件或通用表空间中创建的,它也可能包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog日志等,在8.x之后主要存放的就是Change Buffer(更改缓冲区)的存储区域)

如果InnoDB引擎中,每一张表的独立表空间关闭着的话,那么所有的表的数据以及索引也是在系统表空间存储。

参数:innodb_data_file_path,表示表空间文件在哪。

image-20240720223302844

系统表空间,默认的文件名叫 ibdata1,这个文件存放的就是系统表空间。

image-20240721170402757

二、 File-Per-Table Tablespaces

每张表独立的表空间,就是在这块区域存放着的。

如果开启了innodb_file_per_table开关 ,则每个表的文件表空间包含单个InnoDB表的数据和索引 ,并存储在文件系统上的单个数据文件中。

开关参数:innodb_file_per_table ,该参数默认开启。开启就意味着我们所建立的每一张表都会有一个独立的表空间,并不会在System Tablespace中存放。

image-20240720223328634

那也就是说,我们每创建一个表,都会产生一个表空间文件,进入 /var/lib/mysql/itcast 目录,如图:

以下文件,每一个文件都是一个表空间文件,在这个表空间文件中,它所存放的就是这张表的表结构,以及表中的数据、索引

image-20240720223345722


三、 General Tablespaces

通用表空间,如果我们没有自己去创建,是没有这个表空间文件的。

需要手动通过 CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间。

A. 创建表空间

指定表空间的名字,datafile:指定表空间关联的表空间文件,并且指定存储引擎

CREATE TABLESPACE xxxxx ADD DATAFILE 'file_name' ENGINE = engine_name;

image-20240720223426037

B. 创建表时指定表空间

即这张表的数据就存放在这个表空间文件里

CREATE TABLE xxx ... TABLESPACE ts_name;

image-20240720223448895

此时在 /var/lib/mysql 中就有 myitheima.ibd 文件了,这里面存放的表就是上面的a表。

通用表空间用的不多,了解一下即可。


四、Undo Tablespaces

撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储 undo log日志。

在这个里面会涉及到两个大小相同的表空间文件,这两个大小相同的表空间文件就叫做 undo_001undo_002,默认是这两个。

image-20240721171234124

我们也可以到磁盘中看一下

image-20240721171305338

五、Temporary Tablespaces

临时标记,InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。


六、Doublewrite Buffer Files

双写缓冲区,innoDB引擎将数据页从我们刚才将的内存结构的Buffer Pool刷新到磁盘前,但是刷新到磁盘前,为了保证数据的安全性,先会将数据页写入双写缓冲区文件中,便于系统异常时恢复数据,保证数据的安全性。

双写缓冲区的两个文件如下图

image-20240720223516244

这两个文件在我们磁盘中也是存在的

image-20240721171511677

七、Redo Log

重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中, 用于在刷新脏页到磁盘时,发生错误时, 进行数据恢复使用。

以循环方式写入重做日志文件,它不会永久保存,它会每隔一段时间清理没有用的redo log,因为redo log当事务提交,那么这一块redo log实习上意义也就不大了,因为它的主要作用是保证异常时进行数据恢复,从而保证事务的持久性。

涉及两个文件,来循环写入这两个文件。

image-20240720223537888

前面我们介绍了InnoDB的内存结构,以及磁盘结构,那么内存中我们所更新的数据,又是如何到磁盘中的呢? 此时,就涉及到一组后台线程,接下来,就来介绍一些InnoDB中涉及到的后台线程。

image-20240720223553943

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值