[MySQL] InnoDBを積極的に使わないケース

More than 3 years have passed since last update.

MySQLを使った開発案件では、InnoDBバンザイ、最高と言う空気が感じられますが、

状況次第ではInnoDB最高とは言えないケースに良く遭遇するので、ちょっと書いてみます。

取引先からの相談、依頼で、「うちで開発運用しているシステムで、DB重いから見て欲しい。」

と言うのが、度々あります。

root権限もらって調べると、InnoDB しか使ってない状態で、かなりのケースで

InnoDB のデータサイズが innodb_buffer_pool_size を盛大に超えています。

レスポンスタイムを保障しなければならないケースでは(保障しなくて良いケースに遭遇したこと無いですがw)バッファプールから溢れた時点で負けなので、毎日データ量の監視をして

溢れる前に削除可能なデータを消すか、MyISAM や Archive のテーブルに退避とか

パーティーションでお茶を濁すとかします。

基本的に調達可能なサーバーのスペックには限界が有り、予算や経費にも限界が有るので

有る物で結果を出すためには、リソースの消費量を最小限にしなければなりません。

アプリケーションやサーバーの運用担当者が、この辺のリソース管理やチューニングの

要点を知っているのであれば、全部InnoDBで作って「後は任せた!」でも良いかもしれませんが、

そうではないケースがかなり有ると思われるので、アプリ開発担当者がInnoDBで無ければならない理由を

きちんと説明できないようであれば、そのテーブルは MyISAM にして下さい。

と言うようにしています。

InnoDBとMyISAMでは、テーブル構造とデータ量が同じでも、

確保しなければならないメモリの量が数倍、設計がヒドイと10倍以上違ってきます。

理想は色々有るとは思いますが、現実問題として放置運用しか出来ていないのであれば

極端な話ですが、全部 MyISAM で作ったほうがトラブルは少ないように思います。

デフォルトのストレージエンジンが MyISAM から InnoDB になったからと言って、

MyISAM の信用性がいきなりゼロになった訳ではないからです。

なんか愚痴っぽいなw

これだけではアレなのでMySQLの簡単な状態確認方法を!

InnoDB のデータサイズの計測

sql

select sum( data_length ) from information_schema.tables where engine = 'innodb';

InnoDB バッファプールサイズ

sql

show variables like 'innodb_buffer_pool_size';

データ>バッファ になるとアウト!

MyISAM のキーサイズの計測

sql

select sum( index_length ) from information_schema.tables where engine = 'myisam';

キーバッファサイズ

sql

show variables like 'key_buffer_size';

キーサイズ>キーバッファサイズ になるとアウト!

MyISAM はキーさえバッファに収まっていれば良い点に注意です。

実際には MyISAM の場合、キーサイズがバッファから溢れても

結構持ちこたえます。

一番良いのは mysqltuner を使う。

https://github.com/major/MySQLTuner-perl

単純なperlスクリプトなので、ソースを読むとチューニングの要点が見えてきて勉強になります。