InnoDB的磁盘结构

今天和大家分享InnoDB的磁盘结构是什么样的

InnoDB磁盘主要包含Tablespaces,InnoDB Data Dictionary、Doublewrite Buffer、redo log和undo logs。

Tablespaces:表空间分为系统表空间(ibdata1文件)(共享表空间)、临时表空间、常规表空间、Undo表空间和file-per-table表空间(独立表空间)。系统表空间又包括双写缓冲区(Doublewrite buffer)、Change Buffer等

DoubleWrite Buffer:InnoDB将数据页写到文件之前存放的位置。8.0.20版本之前,doublewrite buffer是存放在InnoDB系统表空间中的,8.0.20版本之后就存放在doublewrite中了。

Redo log: 存储的是log buffer刷到磁盘的数据。

Undo log:存在于global临时表空间中,主要用于回滚事务。

在这里插入图片描述
右边的部分就是InnoDB的磁盘结构的示意图。

表空间详解:

1.系统表空间(System Tablespace)

系统表空间是一个共享的表空间,他是可以被多个表共享的。同时系统表空间可以分成多个文件,每个文件还可以存放到不同的磁盘上。同时他也有缺点,就是所有的数据和索引都是存放在一个文件中,如果数据量很大,那么索引维护效率就会很低。

2.独立表空间(file-per-table)

是一个单表表空间,默认情况下表的数据文件创建于独立表空间中,同时他可以被系统自动回收的。该表是不能被拆分的,如果单表数据量过大,那么可能会出现单表很多个G的情况,这种情况可以用分库分表来处理。

3.通用表空间(General Tablespace)

他是类似于系统表空间,也是一个共享表空间,可以存储多个表上的数据。他不是默认存在的,需要通过特殊语法才能创建的。他最大的特点是可以创建mysql数据库之外的,也就是自定义一个表空间。
当我们创建一张表,这张表肯定是存储在mysql文件下的,但是我们在创建表的时候,指定一个存储路径
例如:create table test.test_ger1(a int) data datadirectory=‘/mdata/general’;
这样表就创建到了mysql外部的地方,正常情况下,mysql的表文件下,会有.frm(表结构)、.ibd(表内容)两个文件,但此时/mdata/general下的test文件夹下只有.frm和.isl两种文件
*** datafile 指定存储路径后,在datadir下会产生一个isl文件,该文件的内容为General space的ibd文件的路径
如果datafile不指定路径,则ibd文件默认存储在datadir目录下,且不需要isl文件了

.在这里插入图片描述

3.撤销表空间(Undo Tablespace)

撤销表空间主要是用来保存回滚日志的,也就是undo log日志的数据。undo log的数据默认是存在系统表空间的ibdata1文件中的。5.7版本之前是没有撤销表空间的,都是存放在系统表空间中,但是在5.7版本之后,就单独开辟了一个撤销表空间,可以专门用来存放回滚日志数据。
那么如果想让undo log存放到撤销表空间该怎么操作呢?
有一个参数是控制是否将undo log日志存放到单独的表空间中,该变量是 innodb_undo_tablespaces,该值默认是0,0就是将数据存到默认的系统表空间中。

将undo log日志存储到系统表空间中的ibdata1文件中有个很大的弊端,就是如果你的写操作比较多的时候,那么就会导致频繁的写入undo log日志,随着日志数据不断增大,ibdata1的文件也就会不断增大,系统表空间是不会主动释放空间的,也就导致此文件只会越来越大,那么读写性能肯定会受影响。所以undo log写入系统表空间肯定是不合适的。

如果我们想调整存储空间该怎么操作呢?
首先需要将innodb_undo_tablespaces设置成大于等于2的一个值(该参数的设置范围是0~128),在mysql5.7之后,还引入了一个新的参数,就是innodb_undo_log_truncate,该值的默认设置是OFF,也就是默认关闭,我们把他配置成ON,并且一定要创建至少两个undo log日志文件,innodb_undo_tablespaces的值大于等于2的情况下,undo log日志才会存储到撤销表空间中。

3.临时表空间(Temporary Tablespace)

该空间主要是存储用户创建的临时表和磁盘内部的临时表。注意:mysql5.7版本之后,临时表的数据才会存储到临时表空间中,临时表空间所对应的文件是ibtmp开头的文件。在5.7之前,还是会存储到系统表空间的ibdata1文件中。该表空间的默认大小是12M(可以无限扩容)。我们也可以设置一个最大限制,可以避免该文件过大。
在这里插入图片描述
我们可以通过设置tmp_table_size来控制临时表空间文件的大小,防止文件过大,过多占空磁盘空间,影响系统性能。
在这里插入图片描述

需要注意的一点,在mysql重启的时候,临时表空间的文件因为存放的都是临时数据,ibtmp文件会被释放掉。如果当该表数据过大,也可以通过重启mysql来达到释放该文件的一个效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值