不同的设置对于负载轻、可预测的服务器来说效果最好,而对于始终处于接近满负荷运行状态的服务器或经历高活动峰值的服务器来说效果不同。
因为 InnoDB
存储引擎会自动执行许多优化操作,所以许多性能调整任务都涉及监控以确保数据库性能良好,并在性能下降时更改配置选项。有关详细的 InnoDB
性能监控信息,请参阅 第 17.16 节,“InnoDB 与 MySQL Performance Schema 集成”。
您可以执行的主要配置步骤包括
控制
InnoDB
缓冲更改数据的类型,以避免频繁的小磁盘写入。请参阅 配置更改缓冲。启用更改缓冲可以提高 I/O 密集型工作负载的性能,但在恢复、批量加载或缓冲池调整大小期间可能会导致问题。禁用它(从 MySQL 8.4 开始默认禁用)有助于确保稳定性,即使它可能会降低性能。使用
innodb_adaptive_hash_index
选项打开和关闭自适应哈希索引功能。有关更多信息,请参阅 第 17.5.3 节,“自适应哈希索引”。您可以在非正常活动期间更改此设置,然后恢复到其原始设置。如果上下文切换是瓶颈,则设置
InnoDB
处理的并发线程数量限制。请参阅 第 17.8.4 节,“为 InnoDB 配置线程并发性”。控制
InnoDB
使用其预读操作进行的预读量。当系统具有未使用的 I/O 容量时,更多预读可以提高查询性能。在负载过重的系统上,过多的预读会导致性能周期性下降。请参阅 第 17.8.3.4 节,“配置 InnoDB 缓冲池预取(预读)”。如果您的高端 I/O 子系统没有被默认值完全利用,则增加读或写操作的后台线程数量。请参阅 第 17.8.5 节,“配置后台 InnoDB I/O 线程的数量”。
控制
InnoDB
在后台执行的 I/O 量。请参阅 第 17.8.7 节,“配置 InnoDB I/O 容量”。如果观察到性能周期性下降,您可以缩减此设置。控制确定
InnoDB
何时执行某些类型后台写入的算法。请参阅 第 17.8.3.5 节,“配置缓冲池刷新”。该算法适用于某些类型的工作负载,但不适用于其他工作负载,因此,如果您观察到性能周期性下降,您可以禁用此功能。利用多核处理器及其缓存内存配置,最大限度地减少上下文切换的延迟。请参阅 第 17.8.8 节,“配置自旋锁轮询”。
防止一次性操作(例如表扫描)干扰存储在
InnoDB
缓冲缓存中的频繁访问数据。请参阅 第 17.8.3.3 节,“使缓冲池抗扫描”。调整日志文件的大小,使其适合可靠性和崩溃恢复。
InnoDB
日志文件通常保持较小,以避免崩溃后出现长时间的启动时间。在 MySQL 5.5 中引入的优化加速了崩溃 恢复 过程的某些步骤。特别是,由于改进了内存管理算法,扫描 重做日志 和应用重做日志的速度更快。如果您一直将日志文件人为地保持较小以避免长时间的启动时间,现在可以考虑增加日志文件大小,以减少由于重做日志记录循环而发生的 I/O 操作。配置
InnoDB
缓冲池的大小和实例数,这对于具有多吉字节缓冲池的系统尤为重要。参见 第 17.8.3.2 节,“配置多个缓冲池实例”。增加并发事务的最大数量,这将极大地提高最繁忙的数据库的可扩展性。参见 第 17.6.6 节,“撤消日志”。
将清除操作(一种垃圾回收类型)移到后台线程。参见 第 17.8.9 节,“清除配置”。要有效地衡量此设置的结果,请首先调整其他与 I/O 相关的和与线程相关的配置设置。
减少
InnoDB
在并发线程之间切换的数量,这样繁忙服务器上的 SQL 操作就不会排队并形成 “交通堵塞”。为innodb_thread_concurrency
选项设置一个值,对于功能强大的现代系统,该值大约为 32。增加innodb_concurrency_tickets
选项的值,通常为 5000 左右。这两个选项的组合对InnoDB
在任何给定时间处理的线程数设置了一个上限,并允许每个线程在被换出之前进行大量工作,从而使等待线程的数量保持较低,并且操作可以在没有过度上下文切换的情况下完成。