動かざることバグの如し

近づきたいよ 君の理想に

【自己責任】MySQLのパフォーマンスを一時的に最大化する危険なチューニング方法

環境

やりたいこと

MySQLで多少リスクを取ってでもパフォーマンスを一時的に向上させたい。

あなたが理解してリスクを承知している前提で、以下の SET GLOBAL で変更可能な設定を調べてみた。

設定

innodb_flush_log_at_trx_commit(トランザクションログの書き込み設定)

  • トランザクションがコミットされるたびに、InnoDBがログバッファからログファイルへどのように書き込むかを制御するオプション
  • デフォルト値は「1」。パフォーマンスよりもACID準拠とデータの安全性を最優先する設定
  • 「0」に設定すると、1秒ごとにログをディスクに書き込むようになる
  • これにより書き込み処理が高速化されるけれど、OSのクラッシュやサーバの電源断が発生した場合、最後のトランザクションが最大1秒分失われるリスクがある
SET GLOBAL innodb_flush_log_at_trx_commit = 0;

sync_binlog(バイナリログの同期設定)

  • このオプションは、バイナリログをディスクにどれくらいの頻度で同期させるかを決める レプリケーションの整合性に関わる
  • デフォルト値は「1」。コミットごとにバイナリログをディスクに同期するため、最も安全な設定
  • 「0」に設定すると、バイナリログのディスクへの同期をOSに任せることになる
  • これで書き込みパフォーマンスは向上するけれど、サーバがクラッシュした場合、バイナリログが破損したり、コミットされたトランザクションの一部が失われたりする可能性がある。レプリケーションが壊れるかも
SET GLOBAL sync_binlog = 0;

参考リンク

innodb_change_bufferingはそもそも無効化したほうがいいかも?