こんにちは。
職人見習いの高嶋です。
データベースを利用したインターネットコンテンツは、不特定多数のユーザが利用するため、しっかりとしたテーブル設計やインデックス設定を行い、正しい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)が書いています。