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大好きなんです。まぁ、ウェブサイト作る時は絶対使いませんけどね…。

コメント