前言
正文
- 1 表示當一個事物提交,立即將log buffer的內容寫入log file並flush到磁盤上即立即發生日誌寫盤,這是保證innodb ACID的一種手段,數據不丟失
- 0 表示log buffer的內容每innodb_flush_log_at_timeout 秒寫入log file並flush到磁盤上,也就是說如果這個時候mysql crash了,那麼會丟失一秒的數據
- 2 表示log buffer的內容在一個事物提交後寫入log file,沒innodb_flush_log_at_timeout 秒 flush到磁盤上,也就是說如果這個時候mysql crash了,那麼 應該會丟失一個事務
上面的描述可能有點迷惑,既然都寫入log file了爲何還要flush到磁盤??這是因爲innodb實現採用的是aio即異步IO,所以這裏的寫入並不是真正的寫入磁盤而是僅僅寫入了VFS的緩存(可以暫時這樣理解),只有調用flush的時候(對應fsync() fdatasync()系統調用)纔是真正的寫入到的磁盤上。
準備一個插入數據的存儲過程,這裏插入的數據爲1000行
mysql> create procedure p_data()
-> begin
-> declare i int;
-> set i=0;
-> while i<1000
-> do
-> insert into t1 values(i,i);
-> set i=i+1;
-> end while;
-> end /
下面看一下這個參數的影響
當innodb_flush_log_at_trx_commit爲1時 1000條數據的插入需要38.71 sec 如果對其進行show profile for query可以看到耗時都發生query end階段,這個階段包含寫盤操作
當innodb_flush_log_at_trx_commit爲0時 1000條數據的插入僅需要0.18 sec 這時間差距。。。。
總結一下
如果業務對於數據的1s丟失是不可接受的那麼也不要管什麼效率不效率的了 直接默認值吧,或者直接上Oracle吧。
如果可以忍受,那麼如果業務的插入操作比較頻繁的話,或者已經成爲了性能瓶頸的話可以考慮一下這個參數的調整。