MYSQL用了好多年了,一次次的优化,一次次的顶过崩溃的边缘,相信能有这样经历的人也不多。这里我写一点这么多年来优化MYSQL的经验。
让我们从头开始
什么机器比较适合跑MYSQL?原则就是IO操作一定要快,要少。在这个原则下,内存肯定是越大越好,硬盘肯定是越快越好。1快硬盘不够快,那就两块,做RAID0。
什么操作系统比较适合跑MYSQL?我试过Linux,FreeBSD,Solaris。solaris是最差的,因为IO慢,的确比其他两个慢,所以我都不用它了。FBSD和linux哪个好?这个我倒是没认真比过,感觉上,fbsd的IO比linux快,所以我有一个5千万条记录的mysql跑在fbsd上,访问量很高的情况下,感觉还是很快。最近的项目都统一到Linux下了,感觉mysql在linux下跑,也不错。看过不少评测,都说mysql在linux比fbsd快,因为我没有实际对比,只有各自的体会,所以也不多评论了。不过fbsd有一点要注意,它默认的数据段大小只有1G,你想开大缓存,就必须重新编译内核,不然会数据段错。
MYSQL5.1都已经在测试了,我们应该用什么版本?如果你是新开发一个产品,建议用5.0,不过我没实际用过,不好说。我用的最多的是3.23.x和4.1.x。由于没有在相同的环境下测试,所以不敢说哪个版本性能最好。所以还是只推荐5.0或者4.1毕竟是现在MYSQL主推的,比较有保证。
我最近用的最多的是4.1。现在我一般会下载for linux+icc编译的二进制包,以前我一般下源文件自己编译,源代码编译的是否好,直接影响性能。关于编译mysql的选项,足够另外写一篇东西了。这里就不提了,有兴趣的看看BUILD目录下的东西。现在我常用的是编译好的二进制包,因为他的编译环境已经基本最优化,而且加上icc编译器的优化,性能还能有一点提升。
接着就是my.cnf了。我一般在support-files目录下的my-innodb-heavy-4G.cnf文件的基础上来修改。对性能影响比较大的,有table_cache,sort_buffer_size,join_buffer_size,query_cache_size,key_buffer_size,read_buffer_size,innodb_additional_mem_pool_size,innodb_buffer_pool_size。用INNODB是肯定的。innodb_additional_mem_pool_size可以大一点,我一般设256M,可以减少不断增加缓存的操作,innodb_buffer_pool_size是初始化的缓存,我觉得2G有点太大了,我倾向于给操作系统本身留点缓存空间。我一般设到1.2G,他自己有需要,也会慢慢涨到2G。