MySql日誌(四)慢查詢日誌

2021-10-10 21:58:58 字數 4112 閱讀 4832

查詢超出變數 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...