InnoDB存储引擎文件
表空间文件
InnoDB
采用将存储的数据按表空间(tablespace
)进行存放的设计。
默认配置下会有一个初始大小为10MB
,名为ibdata1
的文件。
该文件就是默认的表空间文件(tablespace file
)。
可以通过多个文件组成一个表空间,同时制定文件的属性如
innodb_data_file_path = /db/ibdata1:2000M;/dr2/db/ibdata1:2000M:autoextend
若两个文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能。
数据分开存,怎么查?
若设置了参数innodb_file_per_table
,则用户可以将每个基于InnoDB
存储引擎的表产生
一个独立表空间,名为:表名.ibd
。
也即是表空间有以下两种
- 共享表空间
- 独立表空间
需要注意的是,这些单独的表空间文件仅存储该表的数据、索引和插入缓冲BITMAP
等,
其余信息还是存放在默认的表空间中
回滚信息、插入缓冲索引页、系统事务信息、双写缓冲等还是在共享表空间中。
重做日志文件
在默认情况下,在InnoDB
存储引擎的数据目录下会有两个名为ib_logfile0
和
ib_logfile1
的文件。这些文件即为重做日志文件(redo log file
)。
参数innodb_log_files_in_group
指定了日志文件组中重做日志文件的数量,默认为2。
参数innodb_mirrored_log_groups
指定了日志镜像文件组的数量,默认为1,
表示只有一个日志文件组,没有镜像。如磁盘本身已经做了高可用的方案,如磁盘阵列,
那么可以不开启重做日志镜像的功能。
重做日志文件的大小设置对于InnoDB
存储引擎的性能有着非常大的影响。
设置过大,在恢复时需要的时间会很长;设置得过小,则可能导致一个事务的日志需要
多次切换重做日志文件,重做日志太小也会导致频繁发送 async checkpoint
,导致性能抖动。
重做日志的写入
写入重做日志的操作不是直接写,而是先写入一个重做日志缓存(redo log bufer
),然后
按照一定的条件顺序地写入日志文件。
从重做日志缓冲完磁盘写时,是按照512个字节,也就是一个扇区的大小进行写入。因为扇区
是写如的最小单位,因此可以保证写入必定是成功的。因此重做日志的写入过程不需要双写。
双写用在刷脏页上
重做日志与二进制日志的区别
二进制日志会记录所有与
MySQL
数据库有关的日志记录,包括InnoDB
、MyISAM
、Heap
等其他存储引擎的日志。而
InnoDB
存储引擎的重做日志只记录有关该存储引擎本身的事务日志。
记录的内容不同,二进制文件记录的是一个事务的具体操作内容,即逻辑日志(无论是什么格式)。
InnoDB
存储引擎的重做日志记录的是关于每个页的更改的物理情况。写入的时间不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次。
而在事务进行的过程中,会不断有重做日志被写入到重做日志文件中。