スローログが出力されるかどうかの判定は、
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 件のコメント :
コメントを投稿