面对
MySQL的DBA或者做MySQL性能相关的工作的人,我最喜欢问的问题是,在MySQL服务器安装后,如何优化。很多的MySQL服务器都在缺省的配置下运行。
尽管你可以调整非常多的MySQL服务器变量,但是在通常情况下只有少数的变量是真正重要的。在你设置完这些变量以后,其他变量的改动通常只能带来相对有限的性能改善。
key_buffer_size —- 非常重要,如果你使用MyISAM表。如果只使用MyISAM表,那么把它的值设置为可用内存的30%到40%。恰当的大小依赖索引的数量、数据量和负载 —-记住MyISAM使用操作系统的cache去缓存数据,所以你也需要为它留出内存,而且数据通常比索引要大很多。然而需要查看是否所有的 key_buffer总是在被使用 —- key_buffer为4G而.MYI文件只有1G的情况并不罕见。这样就有些浪费了。如果只是使用很少的MyISAM表,你希望它的值小一些,但是仍然至少要设成16到32M,用于临时表(占用硬盘的)的索引。
innodb_buffer_pool_size —- 非常重要,如果使用Innodb表。相对于MyISAM表而言,Innodb表对buffer size的大小更敏感。在处理大的数据集(data set)时,使用缺省的key_buffer_size和innodb_buffer_pool_size,MyISAM可能正常工作,而Innodb可能就是慢得像爬一样了。同时Innodb buffer pool缓存了数据和索引页,因此你不需要为操作系统的缓存留空间,在只用Innodb的数据库服务器上,可以设成占内存的70%到80%。上面 key_buffer的规则也同样适用 —- 如果只有小的数据集,而且也不会戏剧性地增大,那么不要把innodb_buffer_pool_size设得过大。因为你可以更好地使用多余的内存。
innodb_additional_pool_size —- 这个变量并不太影响性能,至少在有像样的(decent)内存分配的操作系统中是这样。但是仍然需要至少设为20MB(有时候更大),是Innodb分配出来用于处理一些杂事的。
innodb_log_file_size —- 对于以写操作为主的负载(workload)非常重要,特别是数据集很大的时候。较大的值会提高性能,但增加恢复的时间。因此需要谨慎。我通常依据服务器的大小(server size)设置为64M到512M。