8.5.4 优化 InnoDB 重做日志

请考虑以下准则以优化重做日志记录:

  • 使重做日志文件变大,甚至与buffer pool一样大。 InnoDB已将重做日志文件写满后,它必须将缓冲池的已修改内容写入checkpoint中的磁盘。小的重做日志文件会导致许多不必要的磁盘写入。尽管历史上大的重做日志文件导致恢复时间很长,但是现在恢复速度要快得多,您可以放心地使用大的重做日志文件。

使用innodb_log_file_sizeinnodb_log_files_in_group配置选项配置重做日志文件的大小和数量。有关修改现有重做日志文件配置的信息,请参见更改 InnoDB 重做日志文件的数量或大小

  • 考虑增加log buffer的大小。较大的日志缓冲区使大型transactions可以运行,而无需在事务commit之前将日志写入磁盘。因此,如果您有更新,插入或删除许多行的事务,则使日志缓冲区更大可以节省磁盘 I/O。使用innodb_log_buffer_size配置选项配置日志缓冲区大小。

  • 配置innodb_log_write_ahead_size配置选项以避免“写时读取”。此选项定义重做日志的预写块大小。设置innodb_log_write_ahead_size以匹配 os 或文件系统缓存块的大小。当由于重做日志的预写块大小与 os 或文件系统缓存块大小不匹配而导致重做日志块未完全缓存到 os 或文件系统时,发生写时读取。

innodb_log_write_ahead_size的有效值是InnoDB日志文件块大小(2n)的倍数。最小值是InnoDB日志文件块大小(512)。指定最小值时,不会发生预写。最大值等于innodb_page_size值。如果您为innodb_log_write_ahead_size指定的值大于innodb_page_size值,则innodb_log_write_ahead_size设置将被截断为innodb_page_size值。

相对于 os 或文件系统缓存块大小,将innodb_log_write_ahead_size值设置得太低会导致写时读取。将该值设置得过高可能会由于一次写入多个块而对日志文件写入的fsync性能产生轻微影响。