mysql內存和IO優化一些重要參數

1、innodb_flush_log_at_trx_commit 

0:日誌緩衝每秒一次地被寫到日誌文件,並且對日誌文件做到磁盤操作的刷新,但是在一個事務提交不做任何操作。

1:在每個事務提交時,日誌緩衝被寫到日誌文件,對日誌文件做到磁盤操作的刷新。

2:在每個提交,日誌緩衝被寫到文件,但不對日誌文件做到磁盤操作的刷新。對日誌文件每秒刷新一次。

默認值是 1,也是最安全的設置,即每個事務提交的時候都會從 log buffer 寫到日誌文件(buffer log),而且會實際刷新磁盤,但是這樣性能有一定的損失。

如果可以容忍在數據庫崩潰的時候損失一部分數據,那麼設置成 0 或者 2 都會有所改善。

設置成 0,則在數據庫崩潰的時候會丟失那些沒有被寫入日誌文件的事務,最多丟失 1 秒鐘的事務,這種方式是最不安全的,也是效率最高的。

設置成 2 的時候,因爲只是沒有刷新到磁盤,但是已經寫入日誌文件,所以只要操作系統沒有崩潰,那麼並沒有丟失數據 ,比設置成 0 更安全一些。

在 mysql 的手冊中,爲了確保事務的持久性和複製設置的耐受性、一致性,都是建議將這個參數設置爲 1 的。


2、innodb_log_file_size

日誌組中的每個日誌文件的大小(單位 MB)。如果 n 是日誌組中日誌文件的數目,那麼理想的數值爲 1M 至下面設置的緩衝池(bufferpool)大小的 1/n。

較大的值,可以減少刷新緩衝池的次數,從而減少磁盤 I/O。但是大的日誌文件意味着在崩潰時需要更長的時間來恢復數據。一般用512M左右,具體取決於服務器的空間。


3、innodb_log_buffer_size

InnoDB 將日誌寫入日誌磁盤文件前的緩衝大小。理想值爲 8M左右。大的日誌緩衝允許事務運行時不需要將日誌保存入磁盤而只到事務被提交(commit)。 

因此,如果有大的事務處理,設置大的日誌緩衝可以減少磁盤I/O。


4、innodb_buffer_pool_size

InnoDB用來高速緩衝數據和索引內存緩衝大小。更大的設置可以使訪問數據時減少磁盤I/O。在一個專用的數據庫(inndb專用)服務器上可以將它設置爲物理內存的80 %,

和key_buffer相同,如果數據量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高內存的使用率。因爲物理內存的使用競爭可能會影響操作系統的頁面調用。


5、innodb_additional_mem_pool_size

InnoDB 用來存儲數據字典(data dictionary)信息和其它內部數據結構(internal data structures)的存儲器組合(memory pool)大小。理想的值爲 2M,

如果有更多的表你就需要在這裏重新分配。如果 InnoDB 用盡這個池中的所有內存,它將從操作系統中分配內存,並將錯誤信息寫入 MySQL 的錯誤日誌中。


6、innodb_file_io_threads

InnoDB 中的文件 I/O 線程。 通常設置爲 4。


7、sync_binlog

二進制日誌(binary log)同步到磁盤的頻率。binary log 每寫入sync_binlog 次後,刷寫到磁盤。如果 autocommit 開啓,每個語句都寫一次 binary log,否則每次事務寫一次。

默認值是 0,不主動同步,而依賴操作系統本身不定期把文件內容 flush 到磁盤

設爲 1 最安全,在每個語句或事務後同步一次 binary log,即使在崩潰時也最多丟失一個語句或事務的日誌,但因此也最慢。

大多數情況下,對數據的一致性並沒有很嚴格的要求,所以並不會把 sync_binlog 配置成 1,爲了追求高併發,提升性能,可以設置爲 100 或直接用 0。


8、write/read thread

異步IO線程數

innodb_write_io_threads=16

innodb_read_io_threads=16

(該參數需要在配置文件中添加,重啓mysql實例起效)髒頁寫的線程數,加大該參數可以提升寫入性能


9、innodb_max_dirty_pages_pct

最大髒頁百分數,當系統中髒頁所佔百分比超過這個值,INNODB就會進行寫操作以把頁中的已更新數據寫入到磁盤文件中。默認75,一般現在流行的SSD硬盤很難達到這個比例。可依據實際情況在75-80之間調節


10、innodb_io_capacity=5000

從緩衝區刷新髒頁時,一次刷新髒頁的數量。根據磁盤IOPS的能力一般建議設置如下:

SAS 200

SSD 5000

PCI-E 10000-50000


11、innodb_flush_method=O_DIRECT(該參數需要重啓mysql實例起效)

控制innodb 數據文件和redo log的打開、刷寫模式。有三個值:fdatasync(默認),O_DSYNC,O_DIRECT。

fdatasync模式:寫數據時,write這一步並不需要真正寫到磁盤纔算完成(可能寫入到操作系統buffer中就會返回完成),真正完成是flush操作,buffer交給操作系統去flush,並且文件的元數據信息也都需要更新到磁盤。

O_DSYNC模式:寫日誌操作是在write這步完成,而數據文件的寫入是在flush這步通過fsync完成。

O_DIRECT模式:數據文件的寫入操作是直接從mysql innodb buffer到磁盤的,並不用通過操作系統的緩衝,而真正的完成也是在flush這步,日誌還是要經過OS緩衝,在大量隨機寫的環境中O_DIRECT要比fdatasync效率更高些,順序寫多的話,還是默認的fdatasync更高效。


12、innodb_adaptive_flushing 

設置爲 ON (使刷新髒頁更智能)


13、innodb_max_dirty_pages_pct  

這個參數據控制髒頁的比例如果是innodb_plugin或是MySQL5.5以上的版本,建議這個參數可以設制到75%-90%都行。如果是大量寫入,而且寫入的數據不是太活躍,可以考慮把這個值設的低一點。 如果寫入或是更新的數據也就是熱數據就可以考慮把這個值設爲:95%


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章