(特にMyISAMを使っていた)ウェブ屋さんがInnoDBを使う場合の設定項目
InnoDBはMyISAMと比較して安全(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