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も活用していこうかな。

tags: MySQL プログラミング

posted by SHOGO

コメントを投稿する

name:
e-mail:
url:
comment:

この記事のトラックバックURL