MySQLが遅い場合のインデックスやチューニングによる対処法【現役SEが解説】

PROGRAM

今回はMySQLが遅い場合の対処法について、インデックスやチューニングで速度を改善する方法を簡単に解説していきます。

インデックスを作成して速度を改善する方法

MySQLを使っていてSELECT文の応答が遅いと感じ始めたら、データが多くなりすぎているのかもしれません。

そのような場合には、WHERE句等でよく条件指定されているカラムのインデックスを作成するようにしましょう。

CREATE INDEX {index_name} ON {table_name} ({column_name, ...})

上記のSQL文はあるテーブルの対象のカラムのインデックスを作成するSQL文です。

インデックスは日本語で言えば本の目次なので、インデックスを作成することでデータを探す際に速度の大幅な改善が期待できるのです。

チューニングをして速度を改善する方法

複数のテーブルを結合(JOIN)したSELECT文ではインデックスだけでは速度が改善されない場合があります。

このような場合には、MySQLに割り当てられているメモリ量が不足し、ディスクアクセスが生じているために遅くなっていることがしばしばあります。

innodb_buffer_pool_size = 256M
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M

MySQLの構成情報であるmy.cnfファイルの上記のようなバッファサイズを調整することにより、速度改善が可能です。

経験上は、結合(JOIN)によるメモリ不足の場合、innodb_buffer_pool_sizeを増やすことで改善される場合が多いです。

その他、sort_buffer_sizeはソート処理時、read_buffer_sizeはフルスキャン時、read_rnd_buffer_sizeはインデックス利用のソート時に使われるバッファになります。

基本的にはこれらのバッファサイズを大きくすれば遅い問題が解決されていくのですが、あまりに大きく設定しすぎるとOS全体で不足してしまうので注意が必要になります。

インデックスやチューニング以外の対処法

インデックスやチューニングを上手く活用することで、大体の場合は遅い問題を解決できます。

しかし、膨大なレコード数となっているテーブルの場合はそもそもに問題があるとも解釈されます。

本当に必要なデータを格納しているのであれば仕方ありませんが、そうでなければ古いデータは別テーブルに移す等も有効な方法です。

また、不要なデータのあるテーブルを結合してしまっていることもよくあるため、できる限り各テーブルで条件を絞れるところはしっかり絞って結合されると良いでしょう。

MySQLの場合のインデックスは1テーブルに1つまでしか使えないですし、チューニングに関しては上手く調整しないとOS全体でメモリ不足となる可能性もあるため、これらの手法に手を出すのであれば、それ以前の問題をきちんと解決するようにしましょう。