(特にMyISAMを使っていた)ウェブ屋さんがInnoDBを使う場合の設定項目

InnoDBMyISAMと比較して安全(OSクラッシュや電源断が発生してもテーブルが壊れない)分、書き込みが遅い。データベース屋さんからすると、それは当然のことでMyISAMがおかしいんだ、ということになり、だからバッテリバックアップ機能のついたRAIDカードを使うんだ、という話になる。でも、MyISAMを使っているウェブ屋さんの現場では、場合によって多少データが消えてもかまわないから、安いハードウェアで大量のアクセスを捌きたい... って乖離があるんじゃないかなーと思ってる。

そのような場合には、my.cnf の innodb_flush_log_at_trx_commit パラメータを調整することで、MyISAMに比肩する書き込み速度を得ることができる(そのかわり、クラッシュや電源断の場合は、設定によって直近1秒以内の変更が失われる)。

他のパラメータも含めて書いておくと、データベース専用サーバ (on linux) の場合は、

[mysqld]
...
innodb_buffer_pool_size=3072M     # innodbに割り振るメモリ。実メモリの75%程度
innodb_log_buffer_size=256M       # あまり大きくしても意味がないような気がする...
innodb_flush_log_at_trx_commit=0  # 毎秒1回データをディスクに書き出し
innodb_flush_method=O_DIRECT
innodb_file_per_table
...

あたりが自分の好み。/etc/sysctl.conf も編集して、

vm.swappiness = 5

とか書いておくと、InnoDBのバッファプールがスワップアウトされる可能性が減って幸せになれる(ことがあるかも)。

linux 以外、あるいは Apache と同居させるような小規模な運用では、O_DIRECT せずに

innodb_buffer_pool_size=512M      # 実メモリの10-20%?
innodb_log_buffer_size=128M
innodb_flush_log_at_trx_commit=0
innodb_file_per_table

として、OSのバッファキャッシュを使うという手もあると思う。そんなにいっぱいデータベース立てた経験ないけど、ベストプラクティスがどのあたりなのか興味があるので、あえて書いてみた。


なお、SATA HDDを使ってるようなケースでは、

% sudo hdparm -W 0 /dev/sda  # 必要なら sdb や sdc も。

して、ディスクの書き込みバッファを無効化しておく必要がある(そうでないと電源断時にデータが壊れる)。これはデータベースソフトウェアに限らない話だけど。


参考:
Open database life: MyISAMとInnoDBのどちらを使うべきか
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数
http://www.klab.jp/media/mysql/index3.html
http://kbase.redhat.com/faq/docs/DOC-18229