こんにちは。
職人見習いの高嶋です。

データベースを利用したインターネットコンテンツは、不特定多数のユーザが利用するため、しっかりとしたテーブル設計やインデックス設定を行い、正しいSQL文を書かないといけません。

それでもやはり処理が遅いSQL文が存在してしまい、ユーザーがそのSQLを立て続けに実行するとサーバ負荷が上がり、サーバがダウンしてしまう事があります。

今回は、MySQLを用いている場合に、処理の遅いSQL文の見つけ方を備忘として記載します。

/etc/my.cnfに下記の設定を記述します。

log-slow-queries          SlowLogの有効化(ログファイル名を指定可能)
long-query-time=1         SlowLogに記録する処理時間の上限
log-long-format          インデックスを使用しなかったSQL文も記録する

これにより、log-slow-queriesで指定したファイルにlong_query_timeで指定した秒数以上かかるSQL文がログとして記載されます。

一般的にlong_query_timeに指定すべき秒数は、アクセスの多いコンテンツであれば1秒以上かかる処理がある時点で注意が必要なので、long_query_time=1とするのが良いと思います。

因みに、現状利用しているMySQLサーバがSlowLogがONになっているかを調べるには、下記のように入力して「log_slow_queries」がONになっているか確認します。

mysql> show variables like 'log%';

SlowLogの出力フォーマットは以下の通りになります。

# Time: 040624  1:25:24 
# User@Host: [ODBC] @ localhost [127.0.0.1]
# Query_time: 5  Lock_time: 0  Rows_sent: 30670  Rows_examined: 38828
select * from city ,country ,language where country.code=city.country and city.country=language.country;

1行目 記録日時
2行目 ユーザーIDとリクエストした端末
3行目 Query_time(実行時間) Lock_time(ロック時間) Rows_sent(送信行数) Rows_examined(処理対象となった行数)
4行目 SQL文

※この記事は、なかの人(piro556)が書いています。