2015年2月25日水曜日

MySQLのスローログ関連のパラメーターが評価される順番

別のエントリー書いてたら、前に誰かに聞かれたなと思ったのでメモ。

スローログが出力されるかどうかの判定は、

1. スローログが有効化されていること
2. log_slow_admin_statements = 0 で除外されるステートメントではないこと
3. (long_query_time以上の時間がかかっている) OR (log_queries_not_using_indexes にマッチする) クエリーであること
4. クエリーのExaminedが min_examined_row_limit 以上であること
5. log_queries_not_using_indexesにマッチしていることが決まっている場合、log_throttle_queries_not_using_indexes で設定された以上の時間が経っているかどうか

意外と4. が知られてなくて、どんなに時間がかかってもmin_examined_row_limitより下のやつはログされない。
5. は5.6からの新機能で、「log_queries_not_using_indexes = 1にした時にスローログどばー問題」を抑制するためのサーバー変数。単位は分で、「前回のインデックス使ってないスローログからx分経過するまでは、次にインデックス使ってないスローログは出力しない」という感じ。

具体的には、long_query_time= 1, min_examined_row_limit= 0, log_queries_not_using_indexes= 1, log_throttle_queries_not_using_index= 1の場合に、


# Time: 150225 10:32:03
# User@Host: root[root] @ localhost []  Id:     4
# Query_time: 0.000371  Lock_time: 0.000175 Rows_sent: 1  Rows_examined: 1
SET timestamp=1424827923;
SELECT * FROM t1;
# Time: 150225 10:33:03
# User@Host: [] @  []  Id:     4
# Query_time: 0.013910  Lock_time: 0.006933 Rows_sent: 1  Rows_examined: 1
SET timestamp=1424827983;
throttle:         39 'index not used' warning(s) suppressed.;
# User@Host: root[root] @ localhost []  Id:     4
# Query_time: 0.001051  Lock_time: 0.000199 Rows_sent: 1  Rows_examined: 1
SET timestamp=1424827983;
SELECT * FROM t1;

こんな風(真ん中のエントリー)になる。

ただしこれ、long_query_timeを超過している && インデックスが使えてないクエリーの場合はカウントされるので、


# Time: 150225 10:35:20
# User@Host: root[root] @ localhost []  Id:     4
# Query_time: 1.000613  Lock_time: 0.000209 Rows_sent: 1  Rows_examined: 1
SET timestamp=1424828120;
SELECT *, sleep(1) FROM t1;
# Time: 150225 10:36:21
# User@Host: [] @  []  Id:     4
# Query_time: 59.052891  Lock_time: 0.011360 Rows_sent: 1  Rows_examined: 1
SET timestamp=1424828181;
throttle:         59 'index not used' warning(s) suppressed.;
# User@Host: root[root] @ localhost []  Id:     4
# Query_time: 1.001240  Lock_time: 0.000198 Rows_sent: 1  Rows_examined: 1
SET timestamp=1424828181;
SELECT *, sleep(1) FROM t1;

long_query_time超えてるんだから出力してほしい気がするけど、今のところこんな仕様。


MySQL :: MySQL 5.6 Reference Manual :: 5.2.5 The Slow Query Log

0 件のコメント :

コメントを投稿