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数据库有关的日志记录,包括InnoDBMyISAMHeap

    等其他存储引擎的日志。而InnoDB存储引擎的重做日志只记录有关该存储引擎本身的事务

    日志。

  • 记录的内容不同,二进制文件记录的是一个事务的具体操作内容,即逻辑日志(无论是什么格式)。

    InnoDB存储引擎的重做日志记录的是关于每个页的更改的物理情况。

  • 写入的时间不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次。

    而在事务进行的过程中,会不断有重做日志被写入到重做日志文件中。