文章目录
- InnoDB存储引擎结构图
- innoDB体系结构
- 一、内存结构
- 1.Buffer Pool
- 2.Change Pool
- 3.Log Buffer
- 二、物理存储结构
- 1.系统表空间
- 2.独立表空间
- 3.Redo日志
- 1、redo 日志
- 4.Undo日志
- 1、undo 日志
- ```回滚段中的UNDO日志分为两种:```
- ```UNDO 日志存储结构```
InnoDB存储引擎结构图
innoDB体系结构
一、内存结构
1.Buffer Pool
InnoDB专用缓存,用来缓存表对象的数据和索引信息的。
Buffer PoolInnoDB Dedicated cache used to cache table object data and index information.
大小由innodb_buffer_pool_size变量指定,默认为128MB。
The size is specified by the innodb_buffer_pool_size variable, which defaults to 128MB.
在独立的数据库服务器中,该缓存大小可以设置为物理内存的80%。
In a standalone database server, this cache size can be set to 80% of physical memory.
2.Change Pool
3.Log Buffer
二、物理存储结构
1.系统表空间
系统表空间
默认情况下InnoDB引擎只对应一个表空间,即系统表空间,所有InnoDB引擎表的数据(含索引)都存
储在该表空间中
,注意仅仅是保存数据和索引,表对象的结构信息仍保存在.frm文件中
。
InnoDB系统表空间对应哪些物理数据文件,通过系统变量 innodb_data_file_path 指定,其语法:
innodb_data_file_path = file_name:file_size[:autoextend[:max:max_file_size]]
2.独立表空间
默认的情况下,InnoDB引擎的表和索引都保存在系统表空间对应的数据文件中
当数据量很大的时 候,管理成本就会上升。系统表空间的数据文件扩展后无法回缩,即使表被DROP或TRUNCATE,甚
至该表空间内实际已经没有任何数据,已分配的空间仍然仅是相对于InnoDB数据可用,而不能被操作系统再分配给其他文件使用。
针对这种情况,可以考虑应用InnoDB数据存储的另一项设定,InnoDB将其定义为多重表空间(multiple tablespaces),就是每个表对象拥有一个独享的.ibd为扩展名的数据文件,这个文件就是一个独立的表空间。
是否启用多重表空间是由系统变量 innodb_file_per_table 控制。
独立表空间优点:
1、各表对象的数据独立存储至不同的文件,可以更灵活地分散I/O、执行备份及恢复操作
2、当执行TRUNCATE/DROP删除表对象时,空间可以即时释放回操作系统层
3.Redo日志
1、redo 日志
redo 日志存储结构
:
redo日志仅针对InnoDB引擎,MySQL数据库的其他引擎是用不到的。默认情况下,InnoDB引擎会创
建两组大小均为5MB的日志文件,分别命名为ib_logfile0和ib_logfile1,日志文件保存在datadir变量指
定的路径下。不过可以通过InnoDB的专用参数修改日志路径、日志文件大小以及日志文件组的数量:
innodb_log_group_home_dir
innodb_log_file_size
innodb_log_files_in_group
redo 在事务中的应用
Redo的作用:
redo 来实现事务持久性,redo 对于AC也有相应的作用
持久性相关组件:
1.重做日志缓存(redo log buffer) ,是易失的
2.重做日志文件(redo log file),是持久的
持久性原理:
当事务提交(Commit)时,会刷新当前事务的redo buffer到重做日志文件中进行持久化,待事务的commit完成才算完成(会将此日志打上commit标记)。还会顺便将一部分redo buffer中没有提交的事务日志也刷新到redo日志文件中。
4.Undo日志
1、undo 日志
undo日志的作用:
对于事务操作来说,有提交就必然会有回滚,提交前面已经提到,就是确定保存写入的数据
,
那么回滚就要麻烦一些,因为它代表着两步操作:首先撤销刚刚做的修改,而后将数据恢复至修改前
的状态
。那么,数据一经写入,怎么恢复到修改前的状态呢?
最简单的方式,**就是在修改前先将旧数据保存下来,保存下的这部分数据就是UNDO日志,存储在系统分配好的 回滚段中
提交:确保提交的数据被保存
回滚的两步曲:一,撤销刚刚做的修改,二、第一步骤的基础上将数据恢复至修改前
回滚段中的UNDO日志分为两种:
1、insert UNDO : 仅在事务回滚时需要,事务提交后即可被废弃
2、update UNDO : 用于构造一致性读,当没有任何事务需要用到行记录的之前版本时才会被废弃。
考虑到InnoDB的回滚段,一致性读这类特性,建议事务尽早提交,不要长期持有。因为长事务可能会造成回滚段过大,占满整个系统表空间,从而拖累整个InnoDB引擎的运行。
UNDO 日志存储结构
默认情况,UNDO日志存储在系统表空间。从MySQL5.6版本开始,InnoDB引擎中的UNDO日志可以单独设置表空间
,即UNDO表空间。想要使用独立的UNDO表空间,只需设置下面三个参数即可:
1、innodb_undo_directory :指定单独存放undo表空间的目录,默认为datadir。MySQL5.7只支持初始化设置,不可中途开启
2、innodb_rollback_segments :回滚段的数量, 至少大于等于35,默认128
3、innodb_undo_tablespaces :指定单独存放的undo表空间个数。必须在mysql初始化阶段设置,初始化完成后就不能再修改
Truncating Undo Tablespaces