Mysql Innodb學習經驗
對於數據庫來講大多瓶頸都出現在IO問題上,所以現在SSD類的設備也才能大行其道。那數據庫的IO這塊有什麼可以優化的嗎? 我這裡大致談一下我的看法,希望能達到一個拋磚引玉的效果。
這裡談一下數據庫本身的配置方面
具體如下: www.2cto.com
配置方面對於IO優化的原則:盡可能能緩存,減少讀對數據庫的隨機IO的請求;同時減少寫的隨機IO的隨時發生,利用各種buffer去緩存。下面來看一下這塊的參數:
innodb_buffer_pool_size : 這是Innodb最重要的一個配置參數,這個參數控制Innodb本身的緩大小,也影響到,多少數據能在緩存中。建議該參數的配置在物理內存的70%-80%之間。
innodb_flush_method: 這個控制Innodb的IO形為,什麼:fsync, O_DSYNC之類的,這裡不做過多介紹, 建議使用: O_DIRECT, 這樣減少操作系統級別VFS的緩存使用內存過多和Innodb本身的buffer的緩存沖突,同時也算是給操作系統減少點壓力。
innodb_io_capacity: 這個參數據控制Innodb checkpoint時的IO能力,一般可以按一塊SAS 15000轉的磁盤200個計算,6塊盤的SAS做的Raid10這個值可以配到600即可。如果是普通的SATA一塊盤只能按100算。(innodb-plugin, Percona有這個參數)
innodb_max_dirty_pages_pct : 這個參數據控制髒頁的比例如果是innodb_plugin或是MySQL5.5以上的版本,建議這個參數可以設制到75%-90%都行。如果是大量寫入,而且寫入的數據不是太活躍,可以考慮把這個值設的低一點。 如果寫入或是更新的數據也就是熱數據就可以考慮把這個值設為:95%
innodb_log_file_size : 這個可以配置256M以上,建議有兩個以前的日志文件(innodb_log_files_in_group). 如果對系統非常大寫的情況下,也可以考慮用這個參數提高一下性能,把文件設的大一點,減少checkpiont的發生。 最大可以設制成:innodb_log_files_in_group * innodb_log_file_size < 512G(percona, MySQL 5.6) 建議設制成: 256M -> innodb_buffer_pool_size/innodb_log_file_in_group 即可。
innodb_log_buffer_size : 如果沒在大事務,控制在8M-16M即可。
其它對IO有影響的參數(以5.6為准)
innodb_adaptive_flushing 默認即可
innodb_change_buffer_max_size 如果是日值類服務,可以考慮把這個增值調到 50
innodb_change_buffering 默認即可
innodb_flush_neighors 默認是開的, 這個一定要開著,充分利用順序IO去寫數據。
innodb_lru_scan_depth: 默認即可 這個參數比較專業。
innodb_max_purge_lag 默認沒啟用,如果寫入和讀取都量大,可以保證讀取優先,可以考慮使用這個功能。 www.2cto.com
innodb_random_read_ahead 默認沒開啟,屬於一個比較活躍的參數,如果要用一定要多測試一下。 對用passport類應用可以考慮使用
innodb_read_ahead_threshold 默認開啟:56 預讀機制可以根據業務處理,如果是passprot可以考慮關閉。如果使用innodb_random_read_ahead,建議關閉這個功能
innodb_read_io_threads 默認為:4 可以考慮8
innodb_write_io_threads 默認為:4 可以考慮8
sync_binlog 默認即可: 0
innodb_rollback_segments 默認即可: 128
另外5.6的undo log也可以獨立配置了,建議單獨配置出來。