2009-10-29
■(特に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のバッファキャッシュを使うという手もあると思う。そんなにいっぱいデータベース立てた経験ないけど、ベストプラクティスがどのあたりなのか興味があるので、あえて書いてみた。
% sudo hdparm -W 0 /dev/sda # 必要なら sdb や sdc も。
して、ディスクの書き込みバッファを無効化しておく必要がある(そうでないと電源断時にデータが壊れる)。これはデータベースソフトウェアに限らない話だけど。
参考:
Open database life: MyISAMとInnoDBのどちらを使うべきか
MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.5.4 InnoDB 起動オプションとシステム変数
- 506 http://reader.livedoor.com/reader/
- 299 http://b.hatena.ne.jp/hotentry
- 213 http://secure.ddo.jp/~kaku/tdiary/
- 193 http://b.hatena.ne.jp/hotentry/it
- 161 http://d.hatena.ne.jp/
- 149 http://www.google.co.jp/reader/view/
- 140 http://www.google.com/reader/view/
- 114 http://phpspot.org/blog/archives/2009/10/20091029.html
- 75 http://www.google.co.jp/reader/view/?hl=ja&tab=wy
- 65 http://b.hatena.ne.jp/
