MySQL 5.7性能调优

MySQL 5.7具有更好的默认值。Morgan Tocker创建了一个页面,其中包含MySQL 5.7中功能的完整列表(http://www.thecompletelistoffeatures.com/,并且是一个很好的参考点。例如,默认情况下设置了以下变量

  • innodb_file_per_table = ON
  • innodb_stats_on_metadata =OFF
  • innodb_buffer_pool_instances = 8(如果innodb_buffer_pool_size <1GB,则为1)
  • query_cache_type = 0; query_cache_size = 0; (禁用互斥锁)

在MySQL 5.7中,只有四个真正重要的变量需要更改。但是,对于特定的工作负载和硬件,可能还需要调整其他InnoDB和全局MySQL变量。

首先,将以下设置添加到[mysqld]部分下的my.cnf。您将需要重新启动MySQL:

[mysqld]
# other variables here
innodb_buffer_pool_size = 1G # (adjust value here, 50%-70% of total RAM)
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1 # may change to 2 or 0
innodb_flush_method = O_DIRECT
描述
变量
innodb_buffer_pool_size 从总RAM的50%开始。不需要大于数据库大小
innodb_flush_log_at_trx_commit

1(默认)

0/2(更高的性能,更低的可靠性)

innodb_log_file_size 128M – 2G(不需要大于缓冲池)
innodb_flush_method O_DIRECT(避免双重缓冲)
 

下一步是什么?

这些是任何新安装的良好起点。还有许多其他变量可以提高某些工作负载的MySQL性能。通常,我会设置一个MySQL监视/绘图工具(例如,Percona Monitoring and Management平台),然后检查MySQL仪表板以执行进一步的调整。

我们可以根据图表进一步调整什么?

InnoDB缓冲池大小看一下图:

MySQL 5.7性能调优

如我们所见,由于我们有可用的RAM并且空闲页面的数量与总的缓冲池相比很小,因此我们可能会受益于将InnoDB缓冲池的大小稍微增加到〜10G。

InnoDB日志文件大小。看一下图:

MySQL 5.7性能调优

正如我们在这里看到的,InnoDB通常每小时写入2.26 GB的数据,超过了日志文件的总大小(2G)。现在我们可以增加innodb_log_file_size  变量并重新启动MySQL。或者,使用“显示引擎InnoDB状态”来计算合适的InnoDB日志文件大小

其他变量

还有许多其他的InnoDB变量可以进一步调整:

innodb_autoinc_lock_mode

设置  innodb_autoinc_lock_mode = 2(交错模式)可以消除对表级AUTO-INC锁定的需要(并且当使用多行插入语句通过auto_increment主键将值插入表中时,可以提高性能)。这需要MIXED   (并且ROW是MySQL 5.7中的默认值)。

innodb_io_capacity innodb_io_capacity_max

这是一种更高级的调整,仅在您始终执行大量写入操作时才有意义(不适用于读取操作,即SELECT)。如果您确实需要对其进行调整,最好的方法是知道系统可以执行多少IOPS。例如,如果服务器有一个SSD驱动器,我们可以设置3000  (最大值的50%)。最好运行sysbench或其他任何基准测试工具来基准化磁盘吞吐量。

但是我们是否需要担心此设置?看一下缓冲池的“ 脏页 ”图:

MySQL 5.7性能调优

在这种情况下,脏页的总数很高,看来InnoDB跟不上刷新它们的速度。如果我们有一个快速磁盘子系统(即SSD),则可能会受益于增加innodb_io_capacity  和innodb_io_capacity_max。

结论或TL; DR版本

新的MySQL 5.7默认值对于一般用途的工作负载要好得多。同时,我们仍然需要配置InnoDB变量以利用包装盒上的RAM量。安装后,请按照下列步骤操作:

  1. 将InnoDB变量添加到my.cnf(如上所述),然后重新启动MySQL
  2. 安装监视系统(例如,Percona监视和管理平台)
  3. 查看图表,确定MySQL是否需要进一步调整