問一個基礎的問題--如果你有一個16G記憶體的伺服器,專用于mysql大型的Innodb資料庫.應該做什麼樣的設定?
硬體
如果你的Innodb資料庫很大,記憶體是首要的.16-32G現在很便宜了.CPU方面 2個雙核的core 就非常好了.但是這跟應用也有很大的關系.第三是IO系統-DAS和RAID是很好的選擇.一般來說6-8塊硬碟就夠了,有時可能需要更多.而且新的2.5"的SAS硬碟,小卻速度快.RAID10對于資料存儲和主要是讀的場合下十分好.需要備援性的話RAID5也不錯但注意對于RAID5的随機寫操作.
作業系統
首先 運作64位的作業系統.現在還有很多32位的系統帶着很大的記憶體運作着.建議不要這麼做.如果系統是linux,對資料庫的目錄使用LVM可以獲得更高效的備份.ext3檔案系統大部分情況下都不會出問題,如果碰到問題的話,試試XFS.如果你使用innodb_file_per_table而且表很多的話可以使用noatime和nodiratime選項,但是這樣做效果不是很大.Also make sure you wrestle OS so it would not swap out MySQL out of memory.
(最後這句話不知道該如何翻譯)
MYSQL 的Innodb 設定
最重要的地方有:
innodb_buffer_pool_size設為記憶體的70%-80%都是安全的.我在一個16G的機器上把它設成12G.
UPDATE關于它具體的檢視[url]http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/[/url]
innodb_log_file_size 這取決于你需要的回複速度.256M這個數值是适當的恢複時間和良好性能之間的一個好的平衡.
innodb_log_buffer_size=4M大多數情況4M足夠,除非正将很大的blob資料導入到Innodb中可以增加一點.
innodb_flush_log_at_trx_commit=2如果你不是很關心ACID,可以容許在系統完全crash的情況下丢失最後一兩秒的事務,那麼可以設定這個值.它可以極大的提高"短"的寫事務的效率.
innodb_thread_concurrency=8這個值取決于你的程式,可能高或者低.8是代表起始值.
innodb_flush_method=O_DIRECT避免雙緩沖(double buffering)和降低swap的壓力.大多數情況下可以提高性能.但是注意如果你RAID cache不夠的話,寫IO的操作會有麻煩.
innodb_file_per_table如果你的表不多可以使用這個選項.這樣你就不會有不受控的innodb主表空間的增長,這個主表空間是不能重新定義的.這個選項在4.1版中引入,現在可以放心使用.
檢視你的程式是否可以運作在READ-COMMITED 隔離模式下,如果可以,就可以設為預設的transaction-isolation=READ-COMMITTED.這個選項有一些性能的優勢,特别是在5.0,5.1版和行級别的複制方面.
其他的可以參考[url]http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/[/url]和[url]http://www.mysqlperformanceblog.com/mysql-performance-presentations/[/url]
應用程式的優化
如果原來是MyISAM,現在你可能需要對應用做一些修改.首先確定你在進行資料庫更新的時候使用事務,這對資料一緻性和性能都有好處.
其次如果你的應用有寫操作的話要注意處理死鎖問題.
第三你要重新檢視你的表結構,盡可能利用Innodb的優勢--主鍵的群集(clustering by primary key),在所有的索引裡面有主鍵,讓主鍵簡單.使用主鍵來快速查詢(在連接配接中使用),large unpacked indexes (try to be easy on indexes).
使用這些基本的innodb性能優化技術,你就會比一般按照預設配置來運作mysql使用者上了一個層次.
本文轉自 小羅ge11 51CTO部落格,原文連結:http://blog.51cto.com/xiaoluoge/1586219,如需轉載請自行聯系原作者