安装 MySQL 后,须要调整的 10 个性能配置项

注意:这篇博文的更新版本在这儿,MySQL 5.7 适用html

原文:Ten MySQL performance tuning settings after installationmysql

在本文中,咱们将探讨在安装好 MySQL 以后,能够进行调整的影响性能的前 10 个配置选项。redis

当咱们做为一名 MySQL 性能审计人员被录用时,他们(公司)会但愿咱们从新检查 MySQL 的配置文件,而且给出一些改进的建议。不少人感到很惊讶,由于在大多数状况下,咱们对已安装的实例仅仅对少数的 MySQL 性能配置项建议进行调整,即便这个实例已经启用了几百个选项。本文的目的是给出一份列举了一些关键性配置项的清单。sql

几年前,咱们曾经在这篇博文中给出了一些建议,但从那之后,MySQL 有了很大的改变。数据库

写在开始以前

即使是经验丰富的人也会失误,也引发不少麻烦。因此在盲目的应用本文推荐的配置项以前,请牢记下面的几项:缓存

  • 一次只更改一个配置项!这是检验本次更改是否有利的途径。
  • 大多数配置项能够在运行时使用 SET GLOBAL 命令来修改。这种方式很是方便,而且若是修改后出现问题,还能立刻恢复原设置。但到最后,仍然须要把这个改变写到配置文件中,使之永久生效。
  • 一个配置的调整即便重启了 MySQL 实例也没有生效?那么你是否使用了正确配置文件?你是否把这个选项写到了正确的节下面?(本文的全部选项都归属于 [mysqld] 节)
  • 服务器在配置调整以后启动失败:你是否使用了正确的单位?例如, innodb_buffer_pool_size 的单位是 byte,而 max_connection 是没有单位的。
  • 同一个配置文件里不要出现重复的配置项。若是你想追踪更改历史,请使用版本控制器。
  • 别作幼稚的运算,如“个人新服务器的 RAM 是旧的 2 倍,所以能够把全部的配置项的值都设置成以前的 2 倍”

基础设置

你应该常常会查看或调整的 3 个 MySQL 性能配置项。若是没有,你可能很快就会遇到问题。安全

innodb_buffer_pool_size:这是任何使用 InnoDB 存储引擎的 MySQL 在安装时第一个应该要查看的配置。Buffer pool 是用来缓存数据和索引的:尽量地设置大一点,以确保在进行大多数读操做时是读内存而不是读磁盘。通常设置值为 5-6GB(8GB RAM),20-25G(32GB RAM),100-120GB(128GB RAM)。服务器

innodb_log_file_size:这个选项是设置 redo 日志(重作日志)的大小。redo 日志 是用来确保写入的数据可以快速地写入,而且持久化,还能够用于崩溃恢复(crash recovery)。MySQL 5.1 以前,这个选项很难去进行调整,由于你既想要加大 redo 日志来提升性能,又想要减少 redo 日志来进行快速的崩溃恢复。幸运的是,自 MySQL 5.5 以后,崩溃恢复的性能有了很大的提升,如今你能够拥有快速写入性能的同时,还能知足快速崩溃恢复。一直到 MySQL 5.5,redo 日志的总大小被限制在 4GB (默认有 2 个日志文件)。这个在 MySQL 5.6 中被增长了。markdown

启动的时候设置 innodb_log_file_size = 512M(也就是 1GB 大小的 redo 日志),这样能够提供充足的写空间。若是你知道你的应用是频繁写入的,而且你使用的 MySQL 版本是 MySQL 5.6,你能够设置 innodb_log_file_size = 4G。并发

max_connections:若是你常常遇到 "Too many 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)。对每一个表使用一个文件的方式,在 drop, truncate, 或者重建表的时候,会回收这个表空间。在一些高级特性,如压缩的时候也须要开启使用独立表空间。然而这个选项却不能带来性能的提高。你不想使用独立表空间的一个主要场景是:有不少的表(例如:10000 以上张表)。

在 MySQL 5.6 中,这个配置项是默认开启的,所以多数状况下,你无需操做。对于早期的 MySQL 版本,须要在加载数据以前把它设置成 ON ,由于它只对新建立的表有影响。

innodb_flush_log_at_trx_commit:默认值为 1,表示 InnoDB 彻底支持 ACID 特性。例如在在一个主节点上,你主要关注数据安全性,这是最好的设置值。然而它会对速度缓慢的磁盘系统形成很大的开销,由于每次将改变刷新到 redo 日志的时候,都须要额外的 fsync 操做。设置为 2,可靠性会差一点,由于已提交的事务只会 1 秒钟刷新一次到 redo 日志,但在某些状况下,对一个主节点而言,这仍然是能够接受的,并且对于复制关系的从库来讲,这是一个很好的值。设置为 0,速度更快,可是在遇到崩溃的时候极可能会丢失一些数据,这只对从库是一个好的设置值。

innodb_flush_method:这个设置项决定了数据和日志刷新到磁盘的方式。当服务器硬件有 RAID 控制器、断电保护、采起 write-back 缓存机制的时候,最经常使用的值是 O_DIRECT;其余大多数场景使用默认值 fdatasync。sysbench 是一个帮助你在这两个值之间作出选择好工具。

innodb_log_buffer_size:这个设置项用来设置缓存尚未提交的事务的缓冲区的大小。默认值(1MB) 通常是够用的,但一旦事务之中带有大 blob/text 字段,这个缓冲区会被很快填满,并引发额外的 I/O 负载。看看 innodb_log_waits 这个状态变量的值,若是不是 0 的话,须要增长 innodb_log_buffer_size。

其它设置

query_cache_size:Query Cache(查询缓存)是一个众所周知的瓶颈位,即便在并发量不高的时候也会出现。最好的选择是从一开始就禁用它,经过设置 query_cache_size = 0 (MySQL 5.6 中如今已经默认禁用),并经过其它途径去提升读查询:合适的索引,增长从库去分散读压力,或者使用一个额外的缓存(例如 memcache 或者 redis)。若是你的 MySQL 已经开启了查询缓存,而且没有发现有任何错误,开启查询缓存多是有利的,若是要禁用它,就须要谨慎了。

log_bin:若是要让一个节点作为复制关系中的主节点,启用二进制日志(binary log)是必须的。这样的话,同时须要设置全局惟一的 server_id。 对于单节点,在但愿作基于时间点的恢复的时候,开启这个选项也是颇有用的:恢复最新的备份和应用二进制日志。二进制日志一旦建立,会被永久保存。因此若是不想耗尽磁盘空间,应该使用 PURGE BINARY LOGS 清理旧的二进制日志文件,或者设置 expire_logs_days 选项指定多少天以后,自动清理过时的二进制日志。

记录二进制日志不是没有开销的。因此,例如是一个复制关系中的从节点,建议禁用二进制日志。

skip_name_resolve:当一个客户端链接上来的时候,服务端会执行主机名解释操做,当 DNS 很慢时,创建的链接也会很慢。所以建议在启动的时候设置 skip-name-resolve 来禁用 DNS 查找。惟一的局限是 GRANT 语句仅且仅能使用 IP 地址,因此,在已有系统中添加这个选项时须要格外当心。

结论

固然,根据你的负载和硬件的实际状况,还有其余的设置可以起到调优的做用:例如在小内存、高速磁盘,高并发,写密集型的负载下,须要特定的调优。不过本文的目的是给出几个 MySQL 的性能调优配置项,让你能够快速获得一个稳健的配置文件,而不用花费大量的时间去调整一些没那么重要的 MySQL 配置项,或者去查阅官方文档来找出哪些配置项对你而言是相当重要的。


后来发现别人已经翻译过了,也一并放上来供诸位同窗参考:
安装完 MySQL 后必须调整的 10 项配置

最后,吐槽一下,博客园的 markdown 解析效果然是丑/(ㄒoㄒ)/~~

相关文章
相关标签/搜索