InnoDB vs MyISAM
今日はMySQLのお話。
データベースを利用するシステムを構築する際、数年前から公私ともにMySQLを愛用しています。最近はSQLiteに浮気気味だけど、SQLiteが使えるシーンや規模は限られているので、特に仕事だとやっぱりMySQLを使うことになる。
MySQLの特長の一つにテーブル型(ストレージエンジン)という物があって、テーブルに格納するデータやインデックスの構築/保存方法を選ぶことができる。特に指定しない場合はMyISAMが使用されるわけだけど、このMyISAMはトランザクションが使えない(アトミックオペレーション)代わりに処理速度が速い、と言われている(実際速い)。MySQLの売りは速さ。その速さを求めてMySQLを使っていた側面が強かったので、なんとかトランザクションを使わないコードを書き、MyISAMの速度の恩恵にあやかってきたわけだ。
それがここに来て、どうしてもトランザクションを使いたいシチュエーションに遭遇してしまった。というわけで、今まで「トランザクションが使える代わりにMyISAMより遅い」と言われていたInnoDBというストレージエンジンについて調べてみたところ、「更新があるシステムにはInnoDBを選ぼう。MyISAMを選択するならそれなりの理由が必要。それにInnoDBのパフォーマンスはそんなに悪くないよ。」という記事を発見。以下リンク先の記事より。
基本はInnoDBです。(中略)パフォーマンスについては(5.0.37以上を選択すれば)InnoDBはMyISAMと比べてほとんど同じです。
実際に複数のベンチマーク結果が載っておりとても参考になった。最近のInnoDBは昔言われていたほど遅くはないらしい。ただしリンク先の記事にもあるとおり、 INSERT/UPDATE/DELETE などの更新系クエリはやはり圧倒的にMyISAMの方が高速なのは変わらず。ならばログ用テーブルのような、更新が主でトランザクション処理が重要でないテーブルにはMyISAM、それ以外にInnoDBという選択肢はかなりありだと思うに至った。
MySQL 5.x系ではInnoDBの性能向上以外にもビュー/トリガー/ストアドプロシージャなどが新たに実装されていて、そろそろ4.1系から乗り換えようかと思っていたところ。これを機にInnoDBも活用していこうかな。
posted by SHOGO