MySQLチューニングの基本「スロークエリログ」を知ろう!

 MySQL を利用したアプリケーションを構築・運用している際に、パフォーマンスの悪い SQL を特定するための基本となる「スロークエリログ」について本稿では解説します。

スロークエリログとは?

 スロークエリログ (Slow query log) は、MySQL で出力できるログの種類の1つです。 SQL の実行時間が指定した時間よりもかかってしまった SQL を全て出力することができます。 これにより、アプリケーション構築時や本番運用時にパフォーマンスのボトルネックとなっている SQL を発見するのに大いに役に立ちます。

 また設定のオプションとして log-queries-not-using-indexes というオプションがあり、このオプションを指定するとインデックスを使っていない SQL も全て出力するようにできます。 これにより、インデックスの設計し忘れ・設定し忘れを発見することもできます。

 MySQL のデフォルト状態ではスロークエリログは出力されませんので、出力するためには次で述べるような設定が必要です。

設定

 スロークエリログを出力させるためには、設定ファイル my.cnf (Windows版を利用している場合には my.ini) に設定の追加が必要です。 [mysqld] のセクションに以下のように設定します。

[mysqld]
(中略)
slow_query_log=ON
long_query_time=0.5
slow_query_log_file=slow_query.log
log-queries-not-using-indexes

 ※スロークエリログを有効にするオプションは、MySQL 5.0までは log_slow_query という名称でしたが、MySQL 5.1からは slow_query_log というオプション名に変更になっています。 ご利用の MySQL Server のバージョンにご注意ください。

 上の例では、SQLの実行に0.5秒以上かかったクエリを出力するように設定しています。 long_query_time というオプションで時間(秒)を指定しています。 slow_query_log_file オプションでログファイル名を出力し、上記の説明の通り log-queries-not-using-indexes オプションでインデックスを利用しなかった SQL も出力するように設定しています。
これでパフォーマンスのボトルネックになっている SQL がログに出力されるようになります。

注意事項

 注意事項としては、ログファイルを吐くということはファイルI/Oが発生するということですから、当然ながら MySQL のパフォーマンスは落ちます。 運用してある程度安定したらログの出力をやめるなど、スロークエリログを吐かせる運用ルールなどを決定しておくのが良いと思います。

おわりに

 本稿では MySQL のパフォーマンス・チューニングで基本となるスロークエリログについて解説しました。 SQL のパフォーマンスが気になる際には、是非役に立ててください。

MySQL 入門へ戻る

著者 : OSCA

OSCA

 初級WEBエンジニアです。最近は Android, iOS, WEBアプリの作成に力を入れています。 個人として何か一つでも世の中の多くの人に使ってもらえるアプリを作ろうと日々奮闘中です。