在开始MySQL性能调整之前:
即使是经验丰富的人也可能会犯错误,从而导致很多麻烦。因此,在盲目应用本文的建议之前,请记住以下几点:
- 一次更改一个设置!这是估计变更是否有益的唯一方法。
- 可以在运行时更改大多数设置
SET GLOBAL
。它非常方便,如果出现任何问题,它可以使您快速还原更改。但是最后,您希望在配置文件中永久调整设置。 - 即使重新启动MySQL,配置更改也不可见?您使用了正确的配置文件吗?您是否将设置放在正确的区域?(本文中的所有设置均属于此
[mysqld]
部分) - 更改后服务器拒绝启动:您使用的单元正确吗?例如,
innodb_buffer_pool_size
应以字节max_connection
为单位设置,而无量纲。 - 不允许在配置文件中重复设置。如果要跟踪更改,请使用版本控制。
- 不要天真地做数学运算,例如“我的新服务器具有2倍的RAM,我会将所有值设为先前值的2倍”。
基本设置
这里是您应该经常查看的3个MySQL性能调整设置。如果不这样做,您很可能会很快遇到问题。
innodb_buffer_pool_size
:这是使用InnoDB进行安装时要检查的#1设置。缓冲池是数据和索引的缓存位置:具有尽可能大的容量将确保您在大多数读取操作中使用内存而不是磁盘。典型值为5-6GB(8GB RAM),20-25GB(32GB RAM),100-120GB(128GB RAM)。
innodb_log_file_size
:这是重做日志的大小。重做日志用于确保写入快速且持久,以及崩溃恢复期间的写入。在MySQL 5.1之前,很难进行调整,因为您既想要大型重做日志以提高性能,又想要小型重做日志以实现快速的崩溃恢复。幸运的是,自MySQL 5.5起,崩溃恢复性能得到了很大的提高,因此您现在可以拥有良好的写入性能和快速的崩溃恢复。在MySQL 5.5之前,总重做日志大小被限制为4GB(默认值为2个日志文件)。这已在MySQL 5.6中取消。
从开始innodb_log_file_size = 512M
(提供1GB的重做日志)应该给您足够的写空间。如果您知道您的应用程序是写密集型的并且正在使用MySQL 5.6,则可以从开始innodb_log_file_size = 4G
。
max_connections
:如果您经常遇到“连接过多”错误,max_connections
则该值太低。由于应用程序无法正确关闭与数据库的连接,因此经常出现这种情况,因此您所需要的比默认的151连接要多得多。max_connections的高值(例如1000或更多)的主要缺点是,如果服务器由于某种原因必须运行1000或更多的活动事务,服务器将变得无响应。在应用程序级别使用连接池或在MySQL级别使用线程池可以帮助您。
InnoDB设置
自从MySQL 5.5以来,InnoDB一直是默认的存储引擎,它比其他任何存储引擎都使用得更频繁。这就是为什么应该仔细配置它的原因。
innodb_file_per_table
:此设置将告诉InnoDB是否应将数据和索引存储在共享表空间(innodb_file_per_table = OFF
)或每个表的单独.ibd文件(innodb_file_per_table= ON
)中。每个表都有一个文件,可让您在删除,截断或重建表时回收空间。一些高级功能(例如压缩)也需要它。但是,它不会提供任何性能优势。当您不希望每个表有文件时,主要的情况是表的数量非常多(例如10k +)。
在MySQL 5.6中,默认值为ON,因此在大多数情况下您无需执行任何操作。对于以前的版本,应在加载数据之前将其设置为ON,因为它仅对新创建的表有效。
innodb_flush_log_at_trx_commit
:默认设置为1表示InnoDB完全兼容ACID。当您最关心的是数据安全性(例如在主机上)时,这是最佳价值。但是,由于需要将每个更改刷新到重做日志所需的额外fsync,因此在磁盘速度较慢的系统上可能会产生大量开销。将其设置为2不太可靠,因为已提交的事务将仅每秒刷新一次到重做日志,但是在某些情况下对于主服务器是可以接受的,对于副本来说绝对是一个不错的选择。0甚至更快,但是如果发生崩溃,您很可能会丢失一些数据:这对于副本来说只是一个不错的选择。
innodb_flush_method:此设置控制如何将数据和日志刷新到磁盘。当您具有带有电池保护的写回缓存的硬件RAID控制器和大多数其他情况下的fdatasync(默认值)时,常用值是O_DIRECT。sysbench是一个很好的工具,可以帮助您在2个值之间进行选择。
innodb_log_buffer_size:这是尚未提交的事务的缓冲区大小。默认值(1MB)通常很好,但是一旦您的事务具有较大的Blob /文本字段,缓冲区就可以很快填满并触发额外的I / O负载。查看Innodb_log_waits状态变量,如果它不为0,则增加innodb_log_buffer_size
。
其他设定
query_cache_size
:查询缓存是众所周知的瓶颈,即使并发程度适中也可以看到。最好的选择是从设置的第一天开始禁用它query_cache_size = 0
(现在是MySQL 5.6的默认设置),并使用其他方式来加快读取查询的速度:良好的索引编制,添加副本以分散读取负载或使用外部缓存(内存缓存或Redis)例如)。如果您已经在启用查询缓存的情况下构建了MySQL应用程序,并且从未发现任何问题,那么查询缓存可能对您有所帮助。因此,如果您决定禁用它,则应谨慎。
log_bin
:如果希望服务器充当复制主服务器,则必须启用二进制日志记录。如果是这样,别忘了还要设置server_id
为唯一值。当您希望能够进行时间点恢复时,它对于单个服务器也很有用:还原最新的备份并应用二进制日志。创建后,二进制日志文件将永久保存。因此,如果您不想用完磁盘空间,则应使用PURGE BINARY LOGS清除旧文件,或设置expire_logs_days
为在几天后自动清除日志。
但是,二进制日志记录不是免费的,因此,例如,如果您不需要非主副本的副本,则建议将其禁用。
skip_name_resolve
:当客户端连接时,服务器将执行主机名解析,而当DNS缓慢时,建立连接也会变慢。因此,建议使用来启动服务器skip-name-resolve
以禁用所有DNS查找。唯一的限制是GRANT
语句必须仅使用IP地址,因此在将此设置添加到现有系统时要小心。
结论
当然,还有其他设置会根据您的工作负载或硬件而有所不同:例如,低内存和快速磁盘,高并发,写密集型工作负载就是您需要进行特定调整的情况。但是,这里的目标是给您一些MySQL性能调整,以使您能够快速获得合理的MySQL配置,而不必花费太多时间更改不必要的MySQL设置或阅读文档来了解哪些设置对您很重要。