MyISAM/InnoDBに関して
最近は常にInnoDBを利用しているので,MyISAM vs InnoDB にちょっとコメントしてみる.
まず「Webアプリならトランザクションはいらないか」について.
Webアプリで,トランザクションの重要性が高くないといっても,無いよりはあった方が良いはず.
ちょっとしたシステムでも,たとえばユーザのテーブル,プロフィールのテーブル,日記の記事のテーブルなどでわけるわけで,それぞれのテーブル間の整合性がとれていないと問題が生じてしまうと思う.
ハードウェア障害などでクラッシュしたときに,ユーザのテーブルにはレコードがあるけど,プロフィールにはレコードが無いケースとか,そういうケースが発生することを考えると,トランザクションは利用すべきじゃないのかなと.
というわけで,JOINを使うようなアプリケーションであれば,トランザクションは使うようにすべき,というのが持論.
それ以外でInnoDBを利用する理由として大きいのは,データが安全,というか,保証されているところ.
MyISAMは,一度クラッシュしてしまうと,もう中身が正しいかどうか判断する方法が無くなってしまう.
myisamchkでチェック・修復した場合,テーブルの構造は正しくなるけれども,データの整合性がとれているとは限らない.
さらに,myisamchkはテーブルのサイズに依存して時間がかかるので大きなDBでは停止時間が長くなってしまう.
InnoDBでは,クラッシュしても再起動時に自動修復されるので,無事起動すればデータの整合性が確保されていると安心できる.
自動修復もテーブルサイズによらないので,でかいDBでも安心.
まぁ,この辺はレプリケーションを利用すれば回避できるので,その場合はあまり影響がないかも.(^^;
速度に関しては,そこまで大きな差は無い...と思う.
InnoDBのベンチ・・・をそのまま信用はできないけど,ベンチ結果が以下に.
http://www.innodb.com/bench.php
体感では,やっぱりInnoDBの方が重く感じることが多いかなぁ.
特にDBサイズがかなり大きくなるので,ディスクキャッシュなどの関係で遅くなってしまうのではと推測・・・
MyISAMのテーブルロックに関しては,短時間で終わる参照と,短時間で終わる更新の場合は問題ないけれど,長時間かかる参照が間にはいるとうまくいかなくなるので,そこに注意すべきかなと.
バッチ処理とかで,テーブルに対して集計をかけたりする場合,MyISAMでは更新・参照トランザクションの両方が待たされてしまうので,Webアプリとしては致命的な遅延が出てしまうはず.
普段は長時間のクエリがなくても,例えばランキングを作ったり,ユーザの男女比率とかを集計したりをする必要があって,長時間のクエリをたまに発行する場合は多いと思う.
でも,あまりそういう点に注意して選ぼう,みたいな記述をみたことがない気がする.
(そもそもテーブルロックだから長時間のクエリは論外?なのかもだけど(^^;)
これも,やっぱりレプリケーションを使えばある程度回避できるので,大規模だとあまり関係ないのかもしれないけど.
普通はレプリして,そういうクエリやらバックアップをスレーブ側からとると思うので...
というわけで,MyISAMでもレプリケーションを使えばトランザクションによる整合性の確保以外は大きな問題がないけれど,そういった工夫をしなくても,
InnoDBなら
・データの整合性に関して安心
・クラッシュ後にちゃんとリカバリでき,速い.
・ロック待ちを気にせず長時間かかる参照クエリを発行できる
というあたりがメリットじゃないかと思う.
欠点は,DBサイズがでかい,でしょうか...
運用に関しては,InnoDBだから面倒,と思うことは無いんだけど,何が面倒だと思わせるんだろう...
設定パラメータはMyISAMより多少多いけど,Oracleとかと比べれば非常に簡素な作りになっていると思うのだけど...
Recent Comments