標籤:

InnoDB的IO優化

對於傳統資料庫的IO優化,一般有幾個方向,如1, 減少資料庫的寫入。2,使用時間換空間,比如壓縮。3,利用物理設備的空間時間 局部性(Locality)特徵。4,把隨機讀寫轉換成順序讀寫。5,緩存數據,一般傳統資料庫都有自己的buffer pool 。

以下簡單說說具體的實現,Innodb的常用的參數、大家已知的定義、設置、作用我就不細說了。大家可以google下具體的參數作用。

減少page size 一些第三方版本早就實現了自定義的page大小,MySQL官方版本高版本才有提供此功能,低版本的話,你可以用源碼編譯的方式實現,如果不是追求極致的話,不建議源碼編譯的方式改變page size,因為可能沒有經歷過大規模的考驗。InnoDB的壓縮技術可以考慮用下,對效率和空間上取得平衡,一般16KB使用2倍壓縮,8KB使用2倍壓縮是可行的。

關閉 doublewrite buffer 。我們知道這個機制讓MySQL的災難恢復性有了強勁保障。關閉它可以減少一半寫入。

innodb_buffer_pool_size 這是一個比較有爭議的參數,官方的建議是70~80%的可用內存,如果你熟悉自己的業務,這個大小一般能夠滿足熱點數據即可。至於是否要70~80%那麼大,對於很大的buffer,比如40G,80G的buffer,更多是經驗的判斷,沒有什麼必然的對錯。 對於一些從傳統Oracle資料庫過來的同學,估計會比較難以理解,為什麼要開這麼大的一個buffer pool,如果真的崩潰了,恢復豈不是要很久?當然, 數據緩存並不是越大越好,這中間的性能曲線,會因應用而不同,那麼,對於開很大的buffer pool,你需要有一個意識,臟數據、內存分配也是有管理開銷的,不要開得太大。當然,你開太大了,絕大部分情況也不會有什麼問題:)

innodb_flush_method 資料庫一般是做了RAID陣列的, 如果是有帶電池的raid卡,推薦用O_DIRECT, 能配合XFS文件系統,配合獨立表空間,會更佳。 關於XFS文件系統的優化,獨立表空間的注意事項,大家可以自行goole之。

Innodb_max_dirty_pages_pct innodb buffer pool里臟頁的比例,這個值建議設置50~70%。好像以前官方的默認配置是90%,但這聽起來,有些離譜,對於大數據量、高並發的,很難以想像絕大部分比例的內存都存放臟數據,難道寫入的都是活躍數據?後來的版本的MySQL的默認設置好像是70%了。這個值設定了,可以自己監控下磁碟的IO活動,如果比較性能曲線比較平穩,就是好的,如果有許多毛刺,可能就需要調整了。

innodb_log_file_size 可以設置大些,一些高並發的業務或者有大欄位的寫入,設置512M或者1G以上,一邊256M對於大部分中小業務足夠了。 設置大了,可以減少checkpoint,但可能導致災難恢復的時間延長,這中間你需要做一個取捨。還有一個不容忽視的現象是,log file 是要佔用操作系統文件cache的。

sync_binlog 這個參數很重要。建議8~20即可,如果寫壓力非常大,也許你的不得不設置得更高,默認的值是0. 這個參數對於事務的吞吐影響很大。為了性能和安全,你不得不做一些平衡。


推薦閱讀:

mongodb寫入數據要注意的一些細節
怎樣在 MySQL 表中存儲樹形結構數據?
注意!Riddle漏洞正在影響低版本Oracle MySQL,請立即更新!
想非常精通資料庫的話需要哪方面數學?
從Mysql邁入資料庫

TAG:MySQL |