写在前面
即使是有经验的人也会犯一些会造成许多麻烦的错误。因此,在应用本文的建议之前,请记住以下内容:
1.每次更改一个设置!这是验证设置是否有效的唯一方法。
2.大多数设置可以使用 set global命令进行更改。这是非常方便的,这样的话如果您的更改产生问题,他可以快速的进行配置恢复。但最后,希望在my.cnf配置文件中永久地调整设置。
3.有时候即使MySQL重启后,配置文件中的设置也不生效。这时候你需要考虑:你使用正确的配置文件了吗?你把这个设置放在正确的地方了吗?(在这篇文章中的所有设置都属于【mysqld】部分)
4.如在更改配置后数据库无法启动,需要检查是否使用正确的单位?例如,innodb_buffer_pool_size应设置为字节,max_connection设置为数值等等。
5.在配置文件中不允许重复设置。如果要跟踪配置的更改,请使用版本控制。
6.不要做幼稚的数学算法,比如“我的新服务器有2倍的RAM,我仅仅会让所有的值比以前的值提高2倍”。
基本设置
这里主要讲解3个非常重要的MySQL性能调优设置,您应该始终查看这些参数。如果你不这样做,你很可能很快遇到问题。
innodb_buffer_pool_size:
该参数是设置InnoDB存储引擎的缓存池。缓冲池是缓存数据和索引的地方:分配尽可能大的内存将确保大多数读取操作中使用内存而不是磁盘。典型的设置值是5-6gb(8GB内存),20-25gb(32GB内存),100-120gb(128GB内存)。
innodb_log_file_size:
该参数是设置重做日志. 重做日志可以加速写入性能,同时会用于数据库Crash Recover. 在MySQL5.1之前,该参数很难去调整, 因为大的Redo Log可以增加写入性能,而小的Redo Log可以提高Crash Recover速度。 幸运的是,自从MySQL 5.5以来,崩溃恢复性能有了很大提高,所以现在加大Redo Log可以拥有良好的写入性能和快速崩溃恢复。在MySQL 5.5中总的重做日志的大小是有限的4GB(默认的是有2个日志文件),这在MySQL 5.6中得到了改进。
默认参数innodb_log_file_size = 512M(默认1GB的重做日志),如果你知道你的应用程序是写密集型,并且你使用的是MySQL 5.6,你可以设置innodb_log_file_size = 4G。
max_connections:
如果你经常遇到 ‘Too many connections’ 错误, 那么是max_connections设置太低. 最有可能的原因是应用程序没有正确的关闭数据库连接, 你需要的连接比默认的151多的多. max_connections设置很高的缺点 (比如1000或更多) 是可能运行1000个活动会话将会使数据库变的缓慢,在应用程序级别使用连接池或在MySQL级别上的线程池可以有助于解决这个问题。
INNODB设置
InnoDB自MySQL 5.5是默认的存储引擎,它比其他任何存储引擎使用的更加频繁。所以我们要仔细配置它。
innodb_file_per_table:
该参数设置将告诉INNODB数据和索引是使用共享表空间 (innodb_file_per_table = OFF) 还是为每个表独立.ibd 文件 (innodb_file_per_table= ON).。设置为独立文件可以在删除、清空或重建表的时候回收磁盘空间。然而,它没有提供任何性能好处。主要的场景是当你不想让你的数据表文件变得非常巨大。
innodb_flush_log_at_trx_commit:
该参数设置为1意味着InnoDB完全遵守ACID原则. 当你最关心数据安全时,这个值是最好的, 但是在一个Master实例上. 它可能对于性能低下的磁盘是一个不小的开销,因为它需要把每个变更刷新到redo log,会产生额外的fsyncs.设置为2会稍微有点不可靠, 因为提交的事务会变为1秒钟刷新一次到redo log, 但是在某些情况下主库是可以接受的,这对于备库是一个比较好的值. 如果设置为0或更加的快,但是在崩溃时更容易丢失一些数据,但是对于备库是一个非常好的值。
innodb_flush_method:
该参数将控制数据和日志如何刷新到磁盘. 比较常见的设置是O_DIRECT, 数据文件的写入操作是直接从mysql innodb buffer写到磁盘的,并不用通过操作系统的缓冲。 该参数默认是fdatasync,这种方式下写数据时,write这一步并不需要真正写到磁盘才算完成(可能写入到操作系统buffer中就会返回完成),真正完成是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。适用于当拥有电池保护的RAID控制器和缓存回写功能等其他一些场景,大家可以使用sysbench做测试,可以帮助大家更好的选择这个值。
innodb_log_buffer_size:
该参数设置的是没有提交的事务缓存区大小,默认值(1MB)通常是够用的,但是如果有大的BLOG/Text字段,缓冲区如果被填满会引起额外的IO负载,我们可以观察Innodb_log_waits状态值,如果它不为0,那么我们需要增加innodb_log_buffer_size 值。
其他设置
query_cache_size:
大家都知道查询缓存是一个瓶颈,即使是在并发量适中的时候也可以看到. 最好的设置就是在第一天使用时就禁用查询缓存(query_cache_size = 0) ,该选项现在MySQL5.6是默认禁用的,我们可以通过其他途径来提高查询速度: 设计好的索引, 增长读写分离 ,或者使用额外的缓存 (memcache or redis for instance). 如果您的MySQL已经启用了查询缓存并且从没有发现出国问题, 那么查询缓存可能是对你有益的. 这个时候如果你想禁用它的时候应该小心操作。
log_bin:
如果希望把数据库作为Master数据库,那么二进制日志是必须要开启的,并且别忘了给每个数据库设置唯一的server_id。如果是单实例数据库,如果你要将数据恢复到之前时间点(使用最新的备份restore,然后使用binlog进行recover),那么就需要二进制日志。Binlog文件一旦创建,将会永久保存在服务器的磁盘上,如果您不想耗尽磁盘空间,那么就需要使用 PURGE BINARY LOGS定期删除老的binlog文件,或者设置expire_logs_days参数让binlog在超过多少天后自动被清理。
二进制文件记录是需要消耗资源的,因为在主从复制环境中,如果备库不需要Binlog,就可以禁用掉。
skip_name_resolve:
当客户端连接数据库的时候, 服务器将进行进行hostname解析, 如果DNS解析变慢的时候, 那么数据库的握手连接也会变慢. 所以我们推荐在服务器启动的时候就配置skip-name-resolve禁止DNS寻址. 这个参数有一个限制是GRANT语句授权时只能使用IP地址,不能使用主机名, 隐藏在一个已使用的数据库设置该参数时就要小心一些。
结论
除此之前,还有其他一些设置是需要依赖你的系统负载或硬件配置来设置。当你需要关注一个优化的CASE时,除了上述关键参数外,还需要关注是否使用了比较少的内存,是否使用了更快的磁盘,是否需要高并发,是否对写入性能要去比较高。
这里我们仅仅提供一些关于MySQL配置性能调优的关键参数,让你快速配置一个合理的MySQL配置文件,并且了解哪些参数对你很重要,而不需要花费大量时候去阅读官方文档。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者DBARUN和本文链接。
翻译工作遵照 CC 协议,如果我的翻译工作有侵犯到您的权益,请及时与我们联系。
本文链接:http://www.dbarun.com/mysql/mysql-performance-tuning-settings-after-installation/