
MySQLのストレージエンジンって、だいたいinnodbを使うのですが、myisamの良さを少しは考えていただきたいということで、今回色々経験をメモっておきたいと思います。webサービスには保守性を考えてinnodbを使うのですが、webサービス以外とかで、myisamを使う機会が非常に多いのです。なんでですかね?ということで色々書いておきます。
myisamはinsertが早い
仕事で5000万レコードぐらいのデータを調査する時とかがあるのですが、その時にinnodbは…なんか遅いんですよね。でも急いでいるのに…そんな時にはmyisamがおすすめです。myisamはinsertもupdateもかなり早いので、webサービスとかで無ければかなりおすすめです。ログをためておいて、よくチェックする場合などですね。
insertする際には、インデックスはあえてつけない方がよいです。insertが完了してから、alter tableでインデックスをつけた方が早い印象があります。
ただ、結構難点もあります。myisamは…
myisamはテーブルが壊れる!
アクセスログを調査する時にmysqlにデータ格納をしていたのですが、ちょっとやらかして負荷がかかってmysqldをrestartするハメになりました。別にいいんですが、こういった時にmyisamのテーブル、壊れてしまうのです…。
復旧するのにも1000億近いレコードを複数テーブルで蓄積していたので、復帰に時間がかかります…。
しかも復帰にリソースが取られますから、復帰中に別のプロセスを仕込んでいるとこれまた重い…。
色々迷惑がかかるのです。なので、webサービスでは使うべきではないです。
myisamは容量が軽い!
アクセスログの大規模調査でmysqlを使っていいて、innodbで最初蓄積をしていたところ、あれ?かなり大きなHDDを使っているのに容量の減りが早い…。これまで使っていた別のサーバーではこんなに容量はなくならなかったのに…と思いました。
調べてみると、innodbが容量が大きいようで、myisamにしたら1/4ぐらいに圧縮できました。保守性をあまり求めない作業に使う場合には、やはりmyisamがおすすめです。
でも、弱点もやっぱりあるんですよね…
myisamはかなりでかいレコード数になった時、速度がどんどん落ちてくる
1億レコードぐらいを入れていたテーブルなんですけど、インデックスが効いている場合、後にどんどん追加していくと…処理が重い上に結構遅くなります。
myisam は早いのはある程度のレコードまでで、後からどんどん重くなります。あまりに大きなレコード数になるようでしたら、innodbのほうがよい結果になります。たぶん。
update系の処理の時、テーブルロックがかかる!
これは本当にmyisamの弱点かなと思うのですが、例えばmyisamのテーブルに少し時間のかかる処理を行っている場合、そのテーブルはロックされています。
なので、selectも何もできず、そのプロセスが終わるまで何もできない状態になります。これは意外とめんどくさいものなのですが、テーブルロックをかけるので速度が早いという点があるので、なかなか難しいところではあります。
テーブルの行数が一瞬で出る!
私はテーブル全体をcountする場合があるのですが、myisamは一瞬で何レコードが入っているのか返してくれます。これに対し、innodbはとにかくくそ遅いです。全部のレコードを数えてます。それは遅いですね。
数値を定期的にカウントするような場合はやはりmyisamがよいと考えています。が、whereを使ったカウントについてはどちらも対してかわりません。
そんなこんなでmyisamを使う人がいないので、たまにはmyisamを使ってみてはくれないかなと思って、どんな時に使っているのか書いてみました。私、myisam大好きなんです。まぁ、ウェブサイト作る時は絶対使いませんけどね…。