文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  优化 InnoDB 重做日志记录

10.5.4 优化 InnoDB 重做日志记录

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

  • 增加重做日志文件的大小。当 InnoDB 写满重做日志文件时,它必须在检查点将缓冲池中已修改的内容写入磁盘。较小的重做日志文件会导致许多不必要的磁盘写入。

    重做日志文件的大小由 innodb_redo_log_capacity 确定。InnoDB 尝试维护 32 个大小相同的重做日志文件,每个文件等于 1/32 * innodb_redo_log_capacity。因此,更改 innodb_redo_log_capacity 设置会更改重做日志文件的大小。

    有关修改重做日志文件配置的信息,请参阅第 17.6.5 节,“重做日志”

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

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

    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 值。

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

  • MySQL 提供了专用的日志写入器线程,用于将重做日志记录从日志缓冲区写入系统缓冲区,并将系统缓冲区刷新到重做日志文件。您可以使用 innodb_log_writer_threads 变量启用或禁用日志写入器线程。专用的日志写入器线程可以提高高并发系统的性能,但对于低并发系统,禁用专用的日志写入器线程可以提供更好的性能。

  • 优化用户线程等待刷新重做时的自旋延迟。自旋延迟有助于减少延迟。在并发量较低的时期,减少延迟可能不是优先事项,并且在这些时期避免使用自旋延迟可能会降低能耗。在并发量较高的时期,您可能希望避免在自旋延迟上花费处理能力,以便将其用于其他工作。以下系统变量允许设置定义自旋延迟使用边界的高水位值和低水位值。

    • innodb_log_wait_for_flush_spin_hwm:定义用户线程在等待刷新重做日志时不再旋转等待的最大平均日志刷新时间。默认值为 400 微秒。

    • innodb_log_spin_cpu_abs_lwm:定义 CPU 使用率的最低值,低于该值时用户线程在等待刷新重做日志时不再旋转等待。该值表示为 CPU 核心使用量的总和。例如,默认值 80 表示单个 CPU 核心的 80%。在具有多核处理器的系统上,值 150 表示一个 CPU 核心的 100% 使用率加上第二个 CPU 核心的 50% 使用率。

    • innodb_log_spin_cpu_pct_hwm:定义 CPU 使用率的最高值,高于该值时用户线程在等待刷新重做日志时不再旋转等待。该值表示为所有 CPU 核心组合总处理能力的百分比。默认值为 50%。例如,在具有四个 CPU 核心的服务器上,两个 CPU 核心的 100% 使用率是组合 CPU 处理能力的 50%。

      innodb_log_spin_cpu_pct_hwm 配置选项考虑了处理器关联性。例如,如果服务器有 48 个核心,但 mysqld 进程仅固定到四个 CPU 核心,则会忽略其他 44 个 CPU 核心。