8.5.9 优化 InnoDB 配置变量

与始终保持接近满负荷运行或遇到高峰活动的服务器相比,不同的设置最适合负载轻且可预测的服务器。

由于InnoDB存储引擎会自动执行许多优化,因此许多性能调整任务涉及监视以确保数据库运行良好,并在性能下降时更改配置选项。有关详细的InnoDB性能监控的信息,请参见第 14.17 节“ InnoDB 与 MySQL 性能模式的集成”

您可以执行的主要配置步骤包括:

  • 使InnoDB在包含它们的系统上使用高性能的内存分配器。参见第 14.8.4 节“为 InnoDB 配置内存分配器”

  • 控制InnoDB缓冲已更改的数据的数据更改操作的类型,以避免频繁的小磁盘写入。参见配置变更缓冲。因为默认设置是缓冲所有类型的数据更改操作,所以仅在需要减少缓冲量时才更改此设置。

  • 使用innodb_adaptive_hash_index选项打开和关闭自适应哈希索引功能。有关更多信息,请参见第 14.5.3 节“自适应哈希索引”。您可以在异常活动期间更改此设置,然后将其恢复为原始设置。

  • 如果上下文切换成为瓶颈,请设置对InnoDB处理的并发线程数的限制。参见第 14.8.5 节“为 InnoDB 配置线程并发”

  • 通过预读操作控制InnoDB进行的预取数量。当系统具有未使用的 I/O 容量时,更多的预读可以提高查询的性能。过多的预读会导致在负载较重的系统上性能周期性下降。参见第 14.8.3.4 节“配置 InnoDB 缓冲池预取(预读)”

  • 如果您拥有默认值未完全利用的高端 I/O 子系统,则增加用于读取或写入操作的后台线程的数量。参见第 14.8.6 节“配置后台 InnoDB I/O 线程数”

  • 控制 I/O InnoDB在后台执行的数量。参见第 14.8.8 节“配置 InnoDB I/O 容量”。如果观察到性能周期性下降,则可以缩减此设置。

  • 控制确定InnoDB何时执行某些类型的后台写入的算法。参见第 14.8.3.5 节“配置缓冲池刷新”。该算法适用于某些类型的工作负载,但不适用于其他类型的工作负载,因此如果您观察到性能周期性下降,则可能会关闭此设置。

  • 利用多核处理器及其高速缓存存储器配置,以最大程度地减少上下文切换中的延迟。参见第 14.8.9 节“配置自旋锁轮询”

  • 防止诸如 table 扫描之类的一次性操作干扰存储在InnoDB缓冲区高速缓存中的频繁访问的数据。参见第 14.8.3.3 节“使缓冲池扫描具有抵抗力”

  • 将日志文件调整为对可靠性和崩溃恢复有意义的大小。 InnoDB日志文件通常保持较小,以避免崩溃后启动时间过长。 MySQL 5.5 中引入的优化加快了recovery崩溃过程的某些步骤。特别是,由于改进了内存 Management 算法,因此扫描redo log和应用重做日志的速度更快。如果您人为地减少了日志文件的大小,以避免启动时间过长,现在可以考虑增加日志文件的大小,以减少由于重做日志记录的回收而产生的 I/O。

  • InnoDB缓冲池配置实例的大小和数量,这对于具有多 GB 缓冲池的系统而言尤其重要。参见第 14.8.3.2 节“配置多个缓冲池实例”

  • 增加并发事务的最大数量,从而极大地提高了最繁忙数据库的可伸缩性。参见第 14.6.7 节“撤消日志”

  • 将清除操作(一种垃圾收集)移动到后台线程中。参见第 14.8.10 节,“清除配置”。为了有效地测量此设置的结果,请首先调整其他与 I/O 相关的配置和与线程相关的配置设置。

  • 减少InnoDB在并发线程之间进行的切换量,以使繁忙的服务器上的 SQL 操作不会排队并形成“流量阻塞”。为innodb_thread_concurrency选项设置一个值,对于高性能的现代系统,最大设置为大约 32.将innodb_concurrency_tickets选项的值通常增加到 5000 左右。选项的这种组合为InnoDB一次处理的线程数设置了上限,并允许每个线程在被换出之前做大量工作,从而使 await 线程数保持较低水平,并且无需过多的上下文切换即可完成操作。