什么是慢查詢
慢查詢,顧名思義禁漓,就是查詢慢的sql語句跟衅,是指mysql記錄所有執(zhí)行超過long_query_time參數(shù)設(shè)定的時間閾值的SQL語句的日志。該日志能為SQL語句的優(yōu)化帶來很好的幫助播歼。默認情況下伶跷,慢查詢?nèi)罩臼顷P(guān)閉的,要使用慢查詢?nèi)罩竟δ芗远瘢紫纫_啟慢查詢?nèi)罩竟δ堋?/p>
慢查詢配置
慢查詢基本配置
- slow_query_log 啟動停止技術(shù)慢查詢?nèi)罩?/li>
- slow_query_log_file 指定慢查詢?nèi)罩镜么鎯β窂郊拔募J和數(shù)據(jù)文件放一起)
- long_query_time 指定記錄慢查詢?nèi)罩維QL執(zhí)行時間得伐值(單位:秒撩穿,默認10秒)
- log_queries_not_using_indexes 是否記錄未使用索引的SQL
- log_output 日志存放的地方【TABLE】【FILE】【FILE,TABLE】
配置了慢查詢后,它會記錄符合條件的SQL谒撼,包括:
- 查詢語句
- 數(shù)據(jù)修改語句
- 已經(jīng)回滾的SQL
通過下面命令查看下上面的配置:
show VARIABLES like '%slow_query_log%'
show VARIABLES like '%slow_query_log_file%'
show VARIABLES like '%long_query_time%'
show VARIABLES like '%log_queries_not_using_indexes%'
show VARIABLES like 'log_output'
set global long_query_time=0; -- 默認10秒食寡,這里為了演示方便設(shè)置為0
set GLOBAL slow_query_log = 1; -- 開啟慢查詢?nèi)罩?/p>
set global log_output='FILE' -- 項目開發(fā)中日志只能記錄在日志文件中,不能記表中
慢查詢?nèi)罩疚募治?/h1>
設(shè)置完成后廓潜,通過 show VARIABLES like 'datadir'來查看數(shù)據(jù)文件存放的位置抵皱。日志文件中的內(nèi)容格式如下:
# User@Host: [root] @ localhost [127.0.0.1]
# Query_time: 0.000997
# Lock_time: 0.000000
# Rows_sent: 5
# Rows_examined: 5
SET timestamp=1539153057;
SELECT * FROM `t_users` LIMIT 0, 1000;
- 第一行:用戶名 善榛、用戶的IP信息、線程ID號
- 第二行:執(zhí)行花費的時間【單位:毫秒】
- 第三行:執(zhí)行獲得鎖的時間
- 第四行:獲得的結(jié)果行數(shù)
- 第五行:掃描的數(shù)據(jù)行數(shù)
- 第六行:這SQL執(zhí)行的具體時間
- 第七行:具體的SQL語句
慢查詢分析工具
Mysqldumpslow
linux系統(tǒng)在mysql的bin目錄下執(zhí)行
./mysqldumpslow -s r -t 5 /usr/local/mysql/data/70KG-224-slow.log
可以看出查詢總時間均為0S呻畸,是因為語句查詢時間太短移盆,實際上是按時間倒序來排的。
參數(shù)說明:
mysqldumpslow -s r -t 10 slow-mysql.log
-s order (c,t,l,r,at,al,ar)
c:總次數(shù)
t:總時間
l:鎖的時間
r:總數(shù)據(jù)行
at(每次執(zhí)行sql耗費的時間),al(每次執(zhí)行sql加鎖用的時間),ar(每次獲取數(shù)據(jù)行數(shù)所用時間)【例如:at = 總時間/總次數(shù)】其中a表示average平均
-t top 指定取前面幾天作為結(jié)果輸出
pt_query_digest
這個工具安裝起來比較復(fù)雜伤为,非專業(yè)sql人員感覺沒必要玩~