Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


5.2.5 スロークエリーログ

スロークエリーログは、実行に要した時間が long_query_time 秒を超え、少なくとも min_examined_row_limit 行を検査する必要があった SQL ステートメントで構成されます。long_query_time の最小値およびデフォルト値は、それぞれ 0 および 10 です。値はマイクロ秒の精度まで指定できます。ファイルへのロギングの場合、時間はマイクロ秒の部分も含めて書き込まれます。テーブルへのロギングの場合、時間の整数部のみ書き込まれ、マイクロ秒の部分は無視されます。

デフォルトでは、管理ステートメントはログに記録されず、参照にインデックスを使用しないクエリーも記録されません。あとで説明するように、この動作は log_slow_admin_statements および log_queries_not_using_indexes を使用して変更することができます。

初期ロックを取得する時間は実行時間として計算されません。mysqld がスロークエリーログにステートメントを書き込むのは、ステートメントが実行されて、すべてのロックが解放されたあとであるため、ログの順序が実行順と異なる場合があります。

デフォルトでは、スロークエリーログは無効になっています。初期のスロークエリーログ状態を明示的に指定するには、--slow_query_log[={0|1}] を使用します。引数を指定しないか、引数が 1 の場合、--slow_query_log によってログが有効になります。引数が 0 の場合、このオプションによってログが無効になります。ログファイル名を指定するには、--slow_query_log_file=file_name を使用します。ログの出力先を指定するには、(セクション5.2.1「一般クエリーログおよびスロークエリーログの出力先の選択」で説明されている) --log-output を使用します。

スロークエリーログファイルの名前を指定しない場合、デフォルト名は host_name-slow.log です。サーバーは、別のディレクトリを指定する絶対パス名が指定されないかぎり、データディレクトリ内にファイルを作成します。

実行時にスロークエリーログを無効化または有効化したり、ログファイル名を変更したりするには、グローバルな slow_query_log および slow_query_log_file システム変数を使用します。slow_query_log を 0 (または OFF) にすると、ログが無効化し、1 (または ON) で有効化します。ログファイルの名前を指定するには、slow_query_log_file を指定します。ログファイルがすでに開いている場合、ログファイルが閉じて新しいファイルが開きます。

スロークエリーログが有効な場合、サーバーは --log-output オプションまたは log_output システム変数によって指定されたあらゆる出力先に出力を書き込みます。ログを有効にすると、サーバーはログファイルを開き、ログファイルに起動メッセージを書き込みます。ただし、FILE ログの出力先が選択されないかぎり、ファイルに対するそれ以上のクエリーのロギングは実行されません。出力先が NONE の場合、スロークエリーログが有効な場合であってもサーバーはクエリーを書き込みません。ログ出力先の値に FILE が含まれていない場合、ログファイル名を設定してもロギングへの影響はありません。

--log-short-format オプションを使用する場合、サーバーによってスロークエリーログ (およびバイナリログ) に書き込まれる情報が少なくなります。

スロークエリーログに書き込まれるステートメントに低速の管理ステートメントを含めるには、log_slow_admin_statements システム変数を使用します。管理ステートメントには、ALTER TABLEANALYZE TABLECHECK TABLECREATE INDEXDROP INDEXOPTIMIZE TABLE、および REPAIR TABLE が含まれます。

スロークエリーログに書き込まれるステートメントに、行参照についてインデックスを使用しないクエリーを含めるには、log_queries_not_using_indexes システム変数を有効にします。そのようなクエリーがログに記録されると、スロークエリーログが急速に増大することがあります。log_throttle_queries_not_using_indexes システム変数を設定することによって、これらのクエリーに速度制限を課すことが可能です。デフォルトでは、この変数は 0 で、制限がないことを意味します。正の値を指定すると、インデックスを使用しないクエリーのロギングについて分あたりの制限が課されます。そのような最初のクエリーによって 60 秒間のウィンドウが開き、その期間内でサーバーはクエリーを所定の制限までログに記録し、そのあと、追加のクエリーを抑制します。ウィンドウが終了したときに抑制されたクエリーが存在する場合、サーバーはクエリーが存在した数と、それらに要した集計時間とを示すサマリーをログに記録します。インデックスを使用しない次のクエリーをサーバーがログに記録するとき、別の 60 秒間のウィンドウが開始されます。

サーバーは、スロークエリーログにクエリーを書き込むかどうかを判断するために、制御パラメータを次の順序で使用します。

  1. クエリーは管理ステートメントでないか、log_slow_admin_statements が有効になっている必要がある。

  2. クエリーに少なくとも long_query_time 秒かかっているか、log_queries_not_using_indexes が有効であって、クエリーは行参照にインデックスを使用していない。

  3. クエリーは少なくとも min_examined_row_limit 行を検査している必要がある。

  4. クエリーは、log_throttle_queries_not_using_indexes 設定によって抑制されていてはならない。

サーバーは、クエリーキャッシュによって処理されるクエリーをスロークエリーログに書き込まず、テーブルに 0 行または 1 行しかないことからインデックスがあることのメリットがないようなクエリーもスロークエリーログに書き込みません。

デフォルトでは、レプリケーションスレーブはレプリケーションされたクエリーをスロークエリーログに書き込みません。これを変更するには、log_slow_slave_statements システム変数を使用します。

MySQL 5.6.3 以降では、スロークエリーログに書き込まれるステートメントのパスワードはサーバーによって書き換えられ、文字どおりに平文で表示されることはありません。MySQL 5.6.3 より前では、ステートメント内のパスワードは書き換えされないため、スロークエリーログを保護するようにしてください。セクション6.1.2.3「パスワードおよびロギング」を参照してください。

スロークエリーログは、実行に長い時間がかかっているため最適化の候補となるクエリーを見つけるために使用できます。ただし、長いスロークエリーログを調査することは、難しいタスクになる場合があります。これを簡単にするために、mysqldumpslow コマンドを使用してスロークエリーログファイルを処理し、ログに表示されるクエリーを要約することができます。セクション4.6.9「mysqldumpslow — スロークエリーログファイルの要約」を参照してください。


User Comments
  Posted by Andrea Gangini on February 8, 2005
Please note that the mysql slow query log will not show the SQL of your slow queries if your application uses prepared statement.
You may want to turn on General Query Log instead.
  Posted by Karen Owen on March 30, 2006
Here are instructions on getting mysqldumpslow to work in your environment if you have my.cnf in a non-standard (eg, non /etc) locale. Please note this is for Unix only.

1. Make sure it can find perl in /usr/local/bin/perl
2. Make sure you've got the slow log running first
3. Copy the slow log to datadir and name it specifically: servername-slow.log (eg, servername-slow.log). This assumes your actual slowlog is located somewhere else. If it is located by default in datadir then you still must make a copy of it, named hostname-slow.log in datadir directory.
4. Make a copy of mysqldumpslow in the $MYSQL_HOME/bin directory, and name it: mysqldumpslow_new and be sure it is chmod 750
5. Edit the mysqldumpslow_new as described in the next item.
6. Assuming you don't place your server's my.cnf in /etc, you must tell my_print_defaults where datadir and basedir are because they can't be set directly in mysqldumpslow nor can they be passed as a parameter on the command line to mysqldumpslow.
This is done by altering the command line option to my_print_defaults, the results of which are fed into the mysqldumpslow perl script to establish datadir, basedir, and a few other variables. The following line in
mysqldumpslow_new should be changed.
Change from:
my $defaults = `my_print_defaults mysqld`;

to:
my $defaults = `my_print_defaults -c /location/where/config_file_lives/my.cnf mysqld`;

Make sure the my.cnf pointed to in the -c option has datadir and basedir set under [mysqld] section.
7. To run the program now, simply type:

./mysqldumpslow_new -s c -t 3

8. You have now displayed output from the slow query log telling you the top 3 slow queries on the system.
  Posted by Christopher Egner on July 19, 2006
Andrea Gangini posted that slow queries made via prepared statements do not post to the slow query log. This is not exactly true.

In the case of MySQL 5.0.22 when accessed through JDBC (Java 1.5.0), slow queries constructed via PreparedStatement always appear in the slow query log. Slow queries constructed normally (via Statement), sometimes appear. I suspect that PreparedStatements bypass the query cache and so are always reported in the log whereas regular Statements are checked against the query cache. If the results are taken from the query cache and not by accessing the tables, the query does not appear in slow query log. Testing regular Statements with the SQL_CACHE and SQL_NO_CACHE hints seems to confirm this. (Remember MySQL does not expend much effort trying to recognise queries it's already seen - if the query strings aren't exactly the same, don't expect to get help from the query cache.)

Chris
  Posted by lvaro G. Vicario on December 20, 2011
Syntax for /etc/my.cnf in Red Hat 9:

[mysqld]
long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log

You must create the file manually and change owners this way:

mkdir /var/log/mysql
touch /var/log/mysql/log-slow-queries.log
chown mysql.mysql -R /var/log/mysql

  Posted by Dan Franklin on December 8, 2008
If you are loading a large database dump created using mysqldump in the normal way, be aware that if an insert statement takes longer than long_query_time, the ENTIRE huge insert statement (with all its individual rows) will be logged to the slow query file. This can significantly extend the time it takes to load the database.
  Posted by Roel Van de Paar on December 8, 2008
An example:

[mysqld]
log-slow-queries = slow.log
long_query_time = 20
log-queries-not-using-indexes

- The first line under [mysqld] turns on slow query log and logs all slow queries to slow.log in the MySQL data directory.
- The second line indicates that any queries that took more than 20 seconds to execute need to be logged.
- The last line tells MySQL to log *any* queries that do not use indexes regardless of the setting in the second line.

If you like you can set the long_query_time very high so that only the queries that do not use indexes are logged (and no 'general' slow queries).
  Posted by Robert Brisita on February 20, 2015
Updated example for 2015 MySQL 5.6:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 10
log_queries_not_using_indexes = 1

Change permissions so that mysqld can write to the specified log file. Giving write permissions to the 'other' group should suffice.
Sign Up Login You must be logged in to post a comment.