2019/3/16 10:48:36
面對MySQL的(de)DBA或者做MySQL性能(néng)相(xiàng)關的(de)工(gōng)作的(de)人(rén),我最喜歡問的(de)問題是,在MySQL服務器(qì)安裝後,需要調整什(shén)麽,假設是以缺省的(de)設置安裝的(de)。
我很驚訝有(yǒu)非常多的(de)人(rén)沒有(yǒu)合理(lǐ)的(de)回答,很多的(de)MySQL服務器(qì)都(dōu)在缺省的(de)配置下運行(xíng)。
盡管可(kě)以調整非常多的(de)MySQL服務器(qì)變量,但(dàn)是在通常情況下隻有(yǒu)少(shǎo)數的(de)變量是真正重要的(de)。在設置完這些變量以後,其他(tā)變量的(de)改動通常隻能(néng)帶來相(xiàng)對有(yǒu)限的(de)性能(néng)改善。
key_buffer_size ---- 非常重要,如(rú)果使用(yòng)MyISAM表。如(rú)果隻使用(yòng)MyISAM表,那麽把它的(de)值設置爲可(kě)用(yòng)内存的(de)30%到(dào)40%。恰當的(de)大(dà)小(xiǎo)依賴索引的(de)數量、數據量和(hé)負載 ----記住MyISAM使用(yòng)操作系統的(de)cache去緩存數據,所以也(yě)需要爲它留出内存,而且數據通常比索引要大(dà)很多。然而需要查看是否所有(yǒu)的(de) key_buffer總是在被使用(yòng) ---- key_buffer爲4G而.MYI文(wén)件(jiàn)隻有(yǒu)1G的(de)情況并不罕見。這樣就有(yǒu)些浪費了。如(rú)果隻是使用(yòng)很少(shǎo)的(de)MyISAM表,希望它的(de)值小(xiǎo)一些,但(dàn)是仍然至少(shǎo)要設成16到(dào)32M,用(yòng)于臨時表(占用(yòng)硬盤的(de))的(de)索引。
innodb_buffer_pool_size ---- 非常重要,如(rú)果使用(yòng)Innodb表。相(xiàng)對于MyISAM表而言,Innodb表對buffer size的(de)大(dà)小(xiǎo)更敏感。在處理(lǐ)大(dà)的(de)數據集(data set)時,使用(yòng)缺省的(de)key_buffer_size和(hé)innodb_buffer_pool_size,MyISAM可(kě)能(néng)正常工(gōng)作,而Innodb可(kě)能(néng)就是慢(màn)得像爬一樣了。同時Innodb buffer pool緩存了數據和(hé)索引頁,因此不需要爲操作系統的(de)緩存留空間,在隻用(yòng)Innodb的(de)數據庫服務器(qì)上(shàng),可(kě)以設成占内存的(de)70%到(dào)80%。上(shàng)面 key_buffer的(de)規則也(yě)同樣适用(yòng) ---- 如(rú)果隻有(yǒu)小(xiǎo)的(de)數據集,而且也(yě)不會(huì)戲劇性地(dì)增大(dà),那麽不要把innodb_buffer_pool_size設得過大(dà)。因爲可(kě)以更好地(dì)使用(yòng)多餘的(de)内存。
innodb_additional_pool_size ---- 這個(gè)變量并不太影響性能(néng),至少(shǎo)在有(yǒu)像樣的(de)(decent)内存分(fēn)配的(de)操作系統中是這樣。但(dàn)是仍然需要至少(shǎo)設爲20MB(有(yǒu)時候更大(dà)),是Innodb分(fēn)配出來用(yòng)于處理(lǐ)一些雜事的(de)。
innodb_log_file_size ---- 對于以寫操作爲主的(de)負載(workload)非常重要,特别是數據集很大(dà)的(de)時候。較大(dà)的(de)值會(huì)提高(gāo)性能(néng),但(dàn)增加恢複的(de)時間。因此需要謹慎。我通常依據服務器(qì)的(de)大(dà)小(xiǎo)(server size)設置爲64M到(dào)512M。
innodb_log_buffer_size ---- 缺省值在中等數量的(de)寫操作和(hé)短的(de)事務的(de)大(dà)多數負載情況下是夠用(yòng)的(de)。如(rú)果有(yǒu)大(dà)量的(de)UPDATE或者大(dà)量地(dì)使用(yòng)blob,可(kě)能(néng)需要增加它的(de)值。不要把它的(de)值設得過多,否則會(huì)浪費内存--log buffer至少(shǎo)每秒刷新一次,沒有(yǒu)必要使用(yòng)超過一秒鍾所需要的(de)内存。8MB到(dào)16MB通常是足夠的(de)。小(xiǎo)一些的(de)安裝應該使用(yòng)更小(xiǎo)的(de)值。
innodb_flush_logs_at_trx_commit ---- 爲Innodb比MyISAM慢(màn)100倍而哭泣?可(kě)能(néng)忘記了調整這個(gè)值。缺省值是1,即每次事務提交時都(dōu)會(huì)把日志刷新到(dào)磁盤上(shàng),非常耗資源,特别是沒有(yǒu)電池備份的(de)cache時。很多應用(yòng)程序,特别是那些從MyISAM表移植過來的(de),應該把它設成2。意味著(zhe)隻把日志刷新到(dào)操作系統的(de)cache,而不刷新到(dào)磁盤。此時,日志仍然會(huì)每秒一次刷新到(dào)磁盤上(shàng),因此通常不會(huì)丢失超過1到(dào)2秒的(de)更新。設成0會(huì)更快一些,但(dàn)安全性差一些,在MySQL服務崩潰的(de)時候,會(huì)丢失事務。設成2隻會(huì)在操作系統崩潰的(de)時候丢失數據。
table_cache ---- 打開(kāi)表是昂貴的(de)(耗資源)。例如(rú),MyISAM表在MYI文(wén)件(jiàn)頭做标記以标明(míng)哪些表正在使用(yòng)。您不會(huì)希望這樣的(de)操作頻繁發生,通常最好調整cache 大(dà)小(xiǎo),使其能(néng)夠滿足大(dà)多數打開(kāi)的(de)表的(de)需要。它使用(yòng)了一些操作系統的(de)資源和(hé)内存,但(dàn)是對于現代的(de)硬件(jiàn)水(shuǐ)平來說通常不是問題。對于一個(gè)使用(yòng)幾百個(gè)表的(de)應用(yòng), 1024是一個(gè)合适的(de)值(注意每個(gè)連接需要各自的(de)緩存)。如(rú)果有(yǒu)非常多的(de)連接或者非常多的(de)表,則需要增大(dà)它的(de)值。我曾經看到(dào)過使用(yòng)超過100000的(de)值。
thread_cache ---- 線程創建/銷毀是昂貴的(de),它在每次連接和(hé)斷開(kāi)連接時發生。我通常把這個(gè)值至少(shǎo)設成16。如(rú)果應用(yòng)有(yǒu)時會(huì)有(yǒu)大(dà)量的(de)并發連接,并且可(kě)以看到(dào) threads_created變量迅速增長,我就把它的(de)值調高(gāo)。目标是在通常的(de)操作中不要有(yǒu)線程的(de)創建。
query_cache ---- 如(rú)果應用(yòng)是以讀(dú)爲主的(de),并且沒有(yǒu)應用(yòng)級的(de)緩存,那麽它會(huì)有(yǒu)很大(dà)幫助。不要把它設得過大(dà),因爲它的(de)維護可(kě)能(néng)會(huì)導緻性能(néng)下降。通常會(huì)設置在32M到(dào) 512M之間。設置好後,經過一段時間要進行(xíng)檢查,看看是否合适。For certain workloads cache hit ratio is lower than would justify having it enabled.(這句不會(huì)翻譯)
注意:就像看到(dào)的(de),上(shàng)面所說的(de)都(dōu)是全局變量。這些變量依賴硬件(jiàn)和(hé)存儲引擎的(de)使用(yòng),而會(huì)話(huà)級的(de)變量(per session variables)則與特定的(de)訪問量(workload)相(xiàng)關。如(rú)果隻是一些簡單的(de)查詢,就沒有(yǒu)必要增加sort_buffer_size,即使有(yǒu) 64G的(de)内存讓您去浪費。而且這樣做還可(kě)能(néng)降低性能(néng)。我通常把調整會(huì)話(huà)級的(de)變量放(fàng)在第二步,在我分(fēn)析了訪問量(或負載)之後。
此外在MySQL分(fēn)發版中包含了一些my.cnf文(wén)件(jiàn)的(de)例子,可(kě)以作爲非常好的(de)模闆去使用(yòng)。如(rú)果能(néng)夠恰當地(dì)從
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967