查詢超出變數 long_query_time 指定時間值的為慢查詢。但是查詢獲取鎖(包括鎖等待)的時間不計入查詢時間內。
mysql記錄慢查詢日誌是在查詢執行完畢且已經完全釋放鎖之後才記錄的,因此慢查詢日誌記錄的順序和執行的sql查詢語句順序可能會不一致(例如語句1先執行,查詢速度慢,語句2後執行,但查詢速度快,則語句2先記錄)。
注意,mysql 5.1之後就支援微秒級的慢查詢超時時長,對於dba來說,乙個查詢執行0.5秒和執行0.05秒是非常不同的,前者可能索引使用錯誤或者走了表掃瞄,後者可能索引使用正確。
另外,指定的慢查詢超時時長表示的是超出這個時間的才算是慢查詢,等於這個時間的不會記錄。
和慢查詢有關的變數:
long_query_time=
10 # 指定慢查詢超時時長(預設10秒),超出此時長的屬於慢查詢
log_output=
# 定義一般查詢日誌和慢查詢日誌的輸出格式,預設為file
log_slow_queries=
# 是否啟用慢查詢日誌,預設不啟用
slow_query_log=
# 也是是否啟用慢查詢日誌,此變數和log_slow_queries修改乙個另乙個同時變化
slow_query_log_file=
/mydata/data/hostname-slow.log #預設路徑為庫檔案目錄下主機名加上-slow.log
log_queries_not_using_indexes=off # 查詢沒有使用索引的時候是否也記入慢查詢日誌
一、啟動和設定慢查詢日誌
現在啟用慢查詢日誌。
mysql>
set @@global
.slow_query_log=on;
log_output= # 定義一般查詢日誌和慢查詢日誌的輸出格式,不指定時預設為file
二、檢視慢查詢日誌
因為預設超時時長為10秒,所以進行乙個10秒的查詢。
mysql>
select
sleep(10
);
檢視慢查詢日誌檔案。這裡看到雖然sleep了10秒,但是最後查詢時間超出了847微秒,因此這裡也記錄了該查詢。
[root@vm_2_223_centos mysql]# tail -f /
var/lib/mysql/vm_2_223_centos-slow.log
time
idcommand argument
# time: 2019-10-16t06:12:36.966416z
# user@host: root[root] @ localhost id: 80
# query_time: 20.000238 lock_time: 0.000000 rows_sent: 1 rows_examined: 0
use db01;
set timestamp=
1571206356
;select
sleep(20
);/usr/sbin/mysqld, version:
5.7.28
-log (
mysql
community server (gpl)
). started with:
tcp port:
3306
unix socket:
/var
/lib/mysql/mysql.sock
time
idcommand argument
# time: 2020-12-01t08:54:59.153235z
# user@host: skip-grants user[root] @ [218.106.126.130] id: 23
# query_time: 10.000395 lock_time: 0.000000 rows_sent: 1 rows_examined: 0
use sys;
set timestamp=
1606812899
;select
sleep(10
);
隨著時間的推移,慢查詢日誌檔案中的記錄可能會變得非常多,這對於分析查詢來說是非常困難的。好在提供了乙個專門歸類慢查詢日誌的工具mysqldumpslow。
[root@xuexi data]# mysqldumpslow --help
-d debug
-v verbose:顯示詳細資訊
-t num just show the top n queries:僅顯示前n條查詢
-a don't abstract all numbers to n and strings to 's':歸類時不要使用n替換數字,s替換字串
-g pattern grep: only consider stmts that include this
string:通過grep來篩選select語句。
該工具歸類的時候,缺省會將同文字但變數值不同的查詢語句視為同一類,並使用n代替其中的數值變數,使用s代替其中的字串變數。可以使用-a來禁用這種替換。如:
reading mysql slow query log from vm_2_223_centos-slow.log
count:
1 time=
20.00s (
20s) lock=
0.00s (
0s) rows=
1.0(1)
, root[root]@localhost
select
sleep(20
)count:
1 time=
0.00s (
0s) lock=
0.00s (
0s) rows=
0.0(0)
,0users@0hosts
# user@host: skip-grants user[root] @ [218.106.126.130] id: 23
# query_time: 13.000312 lock_time: 0.000000 rows_sent: 1 rows_examined: 0
set timestamp=
1606813140
;select
sleep(13
)count:
1 time=
0.00s (
0s) lock=
0.00s (
0s) rows=
0.0(0)
,0users@0hosts
# user@host: skip-grants user[root] @ [218.106.126.130] id: 23
# query_time: 10.000330 lock_time: 0.000000 rows_sent: 1 rows_examined: 0
set timestamp=
1606813127
;select
sleep(10
)count:
1 time=
0.00s (
0s) lock=
0.00s (
0s) rows=
0.0(0)
,0users@0hosts
# user@host: skip-grants user[root] @ [218.106.126.130] id: 23
# query_time: 10.000395 lock_time: 0.000000 rows_sent: 1 rows_examined: 0
use sys;
set timestamp=
1606812899
;select
sleep(10
)
慢查詢在sql語句調優的時候非常有用,應該將它啟用起來,且應該讓慢查詢閾值盡量小,例如1秒甚至低於1秒。就像一天執行上千次的1秒語句,和一天執行幾次的20秒語句,顯然更值得去優化這個1秒的語句。 Mysql日誌 慢查詢日誌
3.設定variables的示範 慢查詢日誌能為sql語句的優化帶來很好的幫助。可以設定乙個閾值,將執行時間超過該值的所有sql語句都記錄到慢查詢日誌檔案中。閾值long query time表示慢查詢的時間閾值,預設值為10,代表10秒。注 慢查詢日誌只會記錄大於閾值的sql語句,小於和等於的sq...
mysql開啟慢查詢日誌 MySQL慢日誌體系建設
慢查詢日誌是mysql提供的一種日誌記錄,用來記錄在mysql中響應時間超過閾值的sql語句,在很大程度上會影響資料庫整體的效能,是mysql優化的乙個重要方向。在58的雲db平台建設中,慢sql系統作為乙個非常重要功能模組,不僅是dba日常運維使用,我們也希望通過該功能可以協助開發人員更快速定位業...
mysql慢日誌時間 MySQL慢查詢日誌優化
一 慢查詢日誌概念 mysql的慢查詢日誌是mysql提供的一種日誌記錄,它用來記錄在mysql中響應時間超過閥值的語句,具體指執行時間超過long query time值的sql,則會被記錄到慢查詢日誌中。long query time的預設值為10,意思是執行10s以上的語句。預設情況下,mys...