第32問:innodb_log_buffer_size 到底有什麼做用?

image

問題:

MySQL 官方文檔說 innodb_log_buffer_size 是 redo log 的寫緩存,設置大一點能減小寫操做。數據庫

咱們用實驗來學習一下這個參數的做用。緩存

實驗:

寬油起個數據庫:性能

image

先將 innodb_log_buffer_size 設置爲最小值。學習

接下來,咱們先建一個有數據的表,建表的方法參考實驗 11:spa

image

重複執行最後一句 insert,直到表中有 65536 行數據:orm

image

接下來咱們複製一張表,由於咱們要作兩次實驗:事務

image

接下來咱們開啓 innodb metrics 和 performance_schema:文檔

image

執行一次 insert,計算一下 LSN 的差值,也就是這個事務產生了多少 redo log:虛擬機

image

能夠看到這個事務大概產生了 3M 左右的 redo log。it

再看一下這個過程發生了多少 IO:

image

能夠看到發生了 7 次 IO,6 次 write 和 1 次 sync,每次 write 大概須要 0.8ms。

如今咱們變動一下 my.cnf,將 innodb_log_buffer_size 變動爲默認值 16777216,重啓數據庫。此處省略步驟, 只看結果:

image

因爲重啓了一次數據庫,記得再開啓一次 innodb metrics 和 performance_schema:

image

再執行一次 insert,計算一下 LSN 的差值, 不過此次用的是 t2 表:

image

也產生了 3M 左右的 redo log。

再來看看 IO:

image

此次只發生了 2 次 IO,一次 write 和一次 sync。

結論:

對比一下兩次 IO 的結果,能夠看到:

  • innodb_log_buffer_size 是 redo log 的寫緩存,若是 buffer 不夠大,就會發生屢次 IO write,將緩存中的數據刷到磁盤;
  • innodb_log_buffer_size 越大,IO 次數越少。

在個人虛擬機環境的通常存儲上,雖然 IO write 次數少了,但 write 的數據量是差很少的,因此總體的 IO 延遲整體差很少;在好點的存儲上,若是數據量差很少, write 次數越少,延遲會越低。

這也就是爲何你們在調整這個參數後, 常常會感知不到性能的提高。


關於 MySQL 的技術內容,大家還有什麼想知道的嗎?趕忙留言告訴小編吧!

image

相關文章
相關標籤/搜索