MySQL优化必须调整的10种配置
几年前,我们在博客上给出了这个建议,但是MySQL世界的变化太快了!
动笔前写…
即使是有经验的人也会犯错误,造成很多麻烦,所以在你盲目地使用这些建议之前,记住以下几点:
一次只换一套!这是检验变化是否有益的唯一方法。
大多数配置可以在运行时用全局设置来改变。这是一种非常方便的方法,可以让您在一个问题之后快速撤消更改。
即使MySQL重新启动了,改变也不行吗请确保您使用正确的配置文件。请确保你把配置在右区(本文提到的所有配置都是{他})
服务器不来修改配置后,请确保您使用正确的单位。例如,对innodb_buffer_pool_size单位是MB和max_connection不是单位。
配置文件中没有重复配置项。如果要跟踪更改,请使用版本控制。
不要使用天真的计算,例如我的服务器内存是现在的2倍,所以我必须把所有的值改为前一次的2倍。
基本配置
您需要经常查看以下3个配置项,否则可能很快就会出现问题。
innodb_buffer_pool_size:这是你应该在你完成安装InnoDB设置选项。缓冲池数据和索引缓存的地方:更大的价值,更好的。这保证了你大部分的读取操作而不是使用硬盘存储,典型值是5-6gb(8GB内存),20-25gb(32GB内存),100-120gb(128GB内存)。
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,你可以开始为4G开始。
max_connections:如果你经常看到连接太多错误,这是因为max_connections值太低,这是很常见的,应用程序不关闭数据库连接正确,你需要一个比151个连接的默认数量较大的值,max_connection价值的一个主要缺点是建立(例如,1000或更高)。当服务器运行1000个或多个活动事务时,它将变得无响应。使用应用程序中的连接池或使用MySQL中的进程池可以解决这个问题。
InnoDB配置
从MySQL 5.5版本,InnoDB是默认的存储引擎,它是更多的使用比任何其他存储引擎。这就是为什么它需要仔细配置。
innodb_file_per_table:这个设置告诉InnoDB是否存储所有表的数据和共享表空间索引(innodb_file_per_table =关闭)或单独的每个表的数据到一个单一的。IBD文件(innodb_file_per_table =对)。每个表是一个文件,允许你恢复磁盘空间在下降,截形,或重建表。这也是一些高级功能,如数据压缩。但它不会带来任何的性能提升。你不想在桌上把文件的主要场景是有非常多的表(如万+的)。
在MySQL 5.6中,这个属性的默认值是打开的,所以在大多数情况下不需要做任何事情。
innodb_flush_log_at_trx_commit:默认值为1,表明我们完全支持ACID特性。这个值是最合适的,你的主要关注的是数据的安全性,如在主节点。但磁盘(读写)慢行系统,它将带来巨大的成本,因为每一次我们改变刷新到重做日志,我们需要更多的fsyncs。设置它的值为2将导致更少的可靠性(可靠),因为提交的事务仅仅是刷新到重做日志每秒,但它是可以接受的,某些情况下,例如,对于主节点的备份节点,这个值是可以接受的。如果该值为0,它会更快,但某些数据可能会丢失当系统崩溃:只备份节点。
对innodb_flush_method配置:确定数据和日志写入硬盘的方式。一般来说,如果你有硬件RAID控制器和独立的缓存采用回写机制和电池断电保护,它应该配置o_direct;否则,在大多数情况下,它应该被设置为fdatasync(默认值)Sysbench是一个很好的工具来帮助你决定这个选项。
的innodb_log_buffer_size:配置确定缓存分配尚未执行的交易。其默认值(1MB)通常是足够的,但如果你的交易包含二进制大型对象或大文本字段,这个缓存将很快被填平,触发额外的我/ O操作。看看innodb_log_waits状态变量,如果它不是0,加innodb_log_buffer_size。
其他设置
query_cache_size:查询缓存(查询缓存)是一个众所周知的瓶颈,即使没有太多的并发。最好的办法是禁用它,从一开始,设置query_cache_size = 0(现在MySQL 5.6的默认值),或用其他方法加速查询的优化指标,添加副本分散负荷,或使额外的缓存,如memcache或redis。如果您已经启用的应用程序并没有发现任何问题的查询缓存,查询缓存可能会对你有用。这是如果你想阻止它,那么你就要小心了。
log_bin:如果你想让数据库服务器作为主节点的备份节点,需要打开二进制日志。如果你这样做,别忘了把server_id作为一种独特的价值。即使只有一个服务器,如果你想做基于时间点的数据恢复,这也是有用的:从你最近的备份恢复(全量备份),将修改二进制日志(增量备份),二进制日志将永久保存,一旦它被创建。所以如果你不想让磁盘空间用完了,您可以使用二进制日志清理净化旧的文件,或设置expire_logs_days指定它将自动删除多少天。
日志二进制日志不是没有成本的,因此如果您不需要在非主节点的复制节点上,建议关闭此选项。
skip_name_resolve:当客户端连接到数据库服务器,该服务器执行主机名解析,并且连接会慢时,DNS是缓慢的。因此,建议skip_name_resolve选项被关闭时,服务器没有DNS查找开始。唯一的限制是,IP地址只能用于随后的grant语句,因此必须添加此设置到一个现有的系统格外小心。
总结
当然,也有可能发挥作用的其他设置,根据你的负载或硬件:在缓慢的内存和高速磁盘,高并发写密集型负载,你将需要特殊的调整。但是,这里的目标是使您能够快速获得强大的MySQL的配置,而不是花太多的时间调整一些不相干的MySQL设置或读取文件找出设置对你很重要。