??? 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。
??? 讓我們從頭開始
???? 什么機器比較適合跑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。