### 8.5.4 优化 InnoDB 重做日志

考虑以下优化重做日志的准则：

-   使您的重做日志文件变大，甚至与[缓冲池](glossary.html#glos_buffer_pool).什么时候`InnoDB`已将重做日志文件写满，它必须将缓冲池的修改内容写入磁盘[检查点](glossary.html#glos_checkpoint).小的重做日志文件会导致许多不必要的磁盘写入。尽管过去大的重做日志文件导致恢复时间过长，但现在恢复速度更快，您可以放心地使用大的重做日志文件。

    重做日志文件的大小和数量使用[`innodb_log_file_size`](innodb-parameters.html#sysvar_innodb_log_file_size)和[`innodb_log_files_in_group`](innodb-parameters.html#sysvar_innodb_log_files_in_group)配置选项。有关修改现有重做日志文件配置的信息，请参阅[更改重做日志文件的数量或大小](innodb-redo-log.html#innodb-redo-log-file-reconfigure).

-   考虑扩大规模[日志缓冲区](glossary.html#glos_log_buffer).大的日志缓冲区使大[交易](glossary.html#glos_transaction)无需在事务之前将日志写入磁盘即可运行[犯罪](glossary.html#glos_commit).因此，如果您有更新、插入或删除许多行的事务，则使日志缓冲区更大可以节省磁盘 I/O。日志缓冲区大小使用[`innodb_log_buffer_size`](innodb-parameters.html#sysvar_innodb_log_buffer_size)配置选项，在 MySQL 8.0 中可以动态配置。

-   配置[`innodb_log_write_ahead_size`](innodb-parameters.html#sysvar_innodb_log_write_ahead_size)配置选项以避免“read-on-write”。此选项定义重做日志的预写块大小。放[`innodb_log_write_ahead_size`](innodb-parameters.html#sysvar_innodb_log_write_ahead_size)以匹配操作系统或文件系统缓存块大小。当重做日志块由于重做日志的预写块大小与操作系统或文件系统缓存块大小不匹配而未完全缓存到操作系统或文件系统时，就会发生写时读取。

    有效值[`innodb_log_write_ahead_size`](innodb-parameters.html#sysvar_innodb_log_write_ahead_size)是的倍数`InnoDB`日志文件块大小（2<sup>n</sup>）。最小值是`InnoDB`日志文件块大小 (512)。指定最小值时不会发生预写。最大值等于[`innodb_page_size`](innodb-parameters.html#sysvar_innodb_page_size)价值。如果您指定一个值[`innodb_log_write_ahead_size`](innodb-parameters.html#sysvar_innodb_log_write_ahead_size)大于[`innodb_page_size`](innodb-parameters.html#sysvar_innodb_page_size)价值[`innodb_log_write_ahead_size`](innodb-parameters.html#sysvar_innodb_log_write_ahead_size)设置被截断为[`innodb_page_size`](innodb-parameters.html#sysvar_innodb_page_size)价值。

    设置[`innodb_log_write_ahead_size`](innodb-parameters.html#sysvar_innodb_log_write_ahead_size)与操作系统或文件系统缓存块大小相关的值太低会导致写入时读取。将值设置得太高可能会对`同步`由于一次写入多个块，日志文件写入的性能。

-   MySQL 8.0.11 引入了专用的日志写入线程，用于将重做日志记录从日志缓冲区写入系统缓冲区，并将系统缓冲区刷新到重做日志文件。以前，单独的用户线程负责这些任务。从 MySQL 8.0.22 开始，您可以使用[`innodb_log_writer_threads`](innodb-parameters.html#sysvar_innodb_log_writer_threads)多变的。专用日志写入线程可以提高高并发系统的性能，但对于低并发系统，禁用专用日志写入线程可以提供更好的性能。

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

    -   [`innodb_log_wait_for_flush_spin_hwm`](innodb-parameters.html#sysvar_innodb_log_wait_for_flush_spin_hwm)：定义最大平均日志刷新时间，超过该时间用户线程在等待刷新重做时不再旋转。默认值为 400 微秒。

    -   [`innodb_log_spin_cpu_abs_lwm`](innodb-parameters.html#sysvar_innodb_log_spin_cpu_abs_lwm): 定义用户线程在等待刷新重做时不再旋转的最小 CPU 使用量。该值表示为 CPU 内核使用率的总和。例如，默认值 80 是单个 CPU 内核的 80%。在具有多核处理器的系统上，值 150 表示一个 CPU 内核的 100% 使用率加上第二个 CPU 内核的 50% 使用率。

    -   [`innodb_log_spin_cpu_pct_hwm`](innodb-parameters.html#sysvar_innodb_log_spin_cpu_pct_hwm)：定义用户线程在等待刷新重做时不再旋转的最大 CPU 使用量。该值表示为所有 CPU 内核的总处理能力的百分比。默认值为 50%。例如，两个 CPU 内核的 100% 使用率是具有四个 CPU 内核的服务器上综合 CPU 处理能力的 50%。

        这[`innodb_log_spin_cpu_pct_hwm`](innodb-parameters.html#sysvar_innodb_log_spin_cpu_pct_hwm)配置选项尊重处理器亲和性。例如，如果服务器有 48 个内核，但[**mysqld**](mysqld.html)进程仅固定到四个 CPU 内核，其他 44 个 CPU 内核将被忽略。
