mysql慢查詢mysqldumpslow的使用詳解
簡(jiǎn)言
1. mysql中的慢查詢是我們分析問題,定位問題的利器,巧妙使用可以快速解決問題
2. 原理:運(yùn)行時(shí)間超過 long_query_time 的sql語(yǔ)句會(huì)被寫入到慢查詢?nèi)罩疚募谢蛘適ysql.slow_log表中,long_query_time的默認(rèn)值是10s
3. 還可以使用慢日志分析工具 mysqldumpslow 來進(jìn)行分析慢查詢
相關(guān)參數(shù)
slow_query_log :是否開啟慢查詢?nèi)罩荆?表示開啟,0表示關(guān)閉。
log-slow-queries :舊版(5.6以下版本)MySQL數(shù)據(jù)庫(kù)慢查詢?nèi)罩敬鎯?chǔ)路徑??梢圆辉O(shè)置該參數(shù),系統(tǒng)則會(huì)默認(rèn)給一個(gè)缺省的文件host_name-slow.log
slow-query-log-file:新版(5.6及以上版本)MySQL數(shù)據(jù)庫(kù)慢查詢?nèi)罩敬鎯?chǔ)路徑??梢圆辉O(shè)置該參數(shù),系統(tǒng)則會(huì)默認(rèn)給一個(gè)缺省的文件host_name-slow.log
long_query_time :慢查詢閾值,當(dāng)查詢時(shí)間多于設(shè)定的該值時(shí),則寫入日志。注意該值修改后再次查詢顯示的還是舊值,要使用 show global variables like 'long_query_time'; 這樣的語(yǔ)句查詢才更新
log_queries_not_using_indexes:未使用索引的查詢也被記錄到慢查詢?nèi)罩局校蛇x項(xiàng))。
log_output:日志存儲(chǔ)方式。log_output='FILE'表示將日志存入文件,默認(rèn)值是'FILE'。log_output='TABLE'表示將日志存入數(shù)據(jù)庫(kù),這樣日志信息就會(huì)被寫入到mysql.slow_log表中。MySQL數(shù)據(jù)庫(kù)支持同時(shí)兩種日志存儲(chǔ)方式,配置的時(shí)候以逗號(hào)隔開即可,如:log_output='FILE,TABLE'。日志記錄到系統(tǒng)的專用日志表中,要比記錄到文件耗費(fèi)更多的系統(tǒng)資源,因此對(duì)于需要啟用慢查詢?nèi)罩荆中枰軌颢@得更高的系統(tǒng)性能,那么建議優(yōu)先記錄到文件
演示步驟
1. 查詢慢查詢是否開啟,慢查詢的閾值,慢查詢?nèi)罩疚募穆窂?/p>
mysql> show global variables like '%query%'; +------------------------------+----------------------------------+ | Variable_name | Value | +------------------------------+----------------------------------+ | binlog_rows_query_log_events | OFF | | ft_query_expansion_limit | 20 | | have_query_cache | NO | | long_query_time | 10.000000 | | query_alloc_block_size | 8192 | | query_prealloc_size | 8192 | | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/kickseed-slow.log | +------------------------------+----------------------------------+ 8 rows in set (0.00 sec)
long_query_time: 10.000000 表慢查詢的閾值是10s,可以精確到0.000001秒,也就是1微秒。關(guān)于運(yùn)行時(shí)間正好等于long_query_time的情況,并不會(huì)被記錄下來。也就是說,在mysql源碼里是判斷大于long_query_time,而非大于等于
slow_query_log:OFF 表慢查詢未開啟
slow_query_log_file:slow_query_log_file 表慢查詢?nèi)罩疚募奈恢?/p>
2. 打開慢查詢開關(guān),修改慢查詢的閾值
mysql> set global slow_query_log=1; Query OK, 0 rows affected (0.00 sec) mysql> set global long_query_time=1.0; Query OK, 0 rows affected (0.00 sec) mysql> show global variables like '%query%'; +------------------------------+----------------------------------+ | Variable_name | Value | +------------------------------+----------------------------------+ | binlog_rows_query_log_events | OFF | | ft_query_expansion_limit | 20 | | have_query_cache | NO | | long_query_time | 1.000000 | | query_alloc_block_size | 8192 | | query_prealloc_size | 8192 | | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/kickseed-slow.log | +------------------------------+----------------------------------+ 8 rows in set (0.00 sec)
long_query_time: 1.000000 表慢查詢的閾值是1.0秒,運(yùn)行時(shí)間超過1秒的sql語(yǔ)句會(huì)被寫入到慢日志文件
slow_query_log:ON 表慢查詢已開啟
謹(jǐn)記:
1) : 修改long_query_time后再查詢不能使用 “show variables like '%query%';”來進(jìn)行查詢,這樣查詢還是舊的,必須要在前面添加global才能查到最新的 long_query_time 值。當(dāng)然也可以斷開這個(gè)連接,重新連接進(jìn)來再查詢不使用global也行
2) : 而且修改long_query_time后,執(zhí)行sql語(yǔ)句的連接必須斷開后再次連接mysql,設(shè)置的閾值才能起效
3) : 設(shè)置slow_query_log=1開啟了慢查詢后只對(duì)當(dāng)前數(shù)據(jù)庫(kù)生效,如果MySQL重啟后則會(huì)失效。如果要永久生效,就必須修改配置文件my.cnf(其它系統(tǒng)變量也是如此)
3. 測(cè)試慢sql語(yǔ)句,查看慢日志
mysql> select sleep(2); +----------+ | sleep(2) | +----------+ | 0 | +----------+ 1 row in set (2.01 sec)
select sleep(2);表執(zhí)行暫停2秒的sql語(yǔ)句
然后我們打開慢日志文件,也就是slow_query_log_file的值,即/var/lib/mysql/kickseed-slow.log文件,跳轉(zhuǎn)到最后可以看到如下內(nèi)容
# Time: 2021-02-23T11:38:25.222093Z # User@Host: root[root] @ localhost [127.0.0.1] Id: 19 # Query_time: 2.000681 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 SET timestamp=1614080303; select sleep(2);
Time:Time: 2021-02-23T11:38:25.222093Z 表該條慢sql執(zhí)行的時(shí)間點(diǎn)
User@Host: root[root] @ localhost [127.0.0.1] Id: 19 表該條慢sql的連接賬號(hào)為root,IP地址為127.0.0.1,Id表連接ID,每次連接該ID加1
Query_time: 2.000681 表執(zhí)行該sql的總時(shí)間為2.000681秒
Lock_time: 0.000000 表鎖表時(shí)間
Rows_sent: 1 表發(fā)送sql結(jié)果的行數(shù),只有1行
Rows_examined: 1 表執(zhí)行該sql語(yǔ)句檢查數(shù)據(jù)庫(kù)的行數(shù)
4. 系統(tǒng)變量 log_output, log-queries-not-using-indexes, log_slow_admin_statements的作用
log_output='FILE'表示將日志存入文件,默認(rèn)值是'FILE'。log_output='TABLE'表示將日志存入數(shù)據(jù)庫(kù),這樣日志信息就會(huì)被寫入到mysql.slow_log表中。MySQL數(shù)據(jù)庫(kù)支持同時(shí)兩種日志存儲(chǔ)方式,配置的時(shí)候以逗號(hào)隔開即可,如:log_output='FILE,TABLE'。日志記錄到系統(tǒng)的專用日志表中,要比記錄到文件耗費(fèi)更多的系統(tǒng)資源,因此對(duì)于需要啟用慢查詢?nèi)罩荆中枰軌颢@得更高的系統(tǒng)性能,那么建議優(yōu)先記錄到文件
mysql> show variables like '%log_output%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ 1 row in set (0.01 sec)
log-queries-not-using-indexes:未使用索引的查詢也被記錄到慢查詢?nèi)罩局校蛇x項(xiàng))。如果調(diào)優(yōu)的話,建議開啟這個(gè)選項(xiàng)。另外,開啟了這個(gè)參數(shù),其實(shí)使用full index scan的sql也會(huì)被記錄到慢查詢?nèi)罩?/p>
mysql> show variables like 'log_queries_not_using_indexes'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ 1 row in set (0.01 sec)
log_slow_admin_statements表示是否將慢管理語(yǔ)句例如ANALYZE TABLE和ALTER TABLE等記入慢查詢?nèi)罩?/p>
mysql> show variables like 'log_slow_admin_statements'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | log_slow_admin_statements | OFF | +---------------------------+-------+ 1 row in set (0.01 sec)
5. 日志分析工具mysqldumpslow,mysql官方自帶的,只要安裝了mysql就可以使用它,可以用來幫助我們分析慢日志文件
在生產(chǎn)環(huán)境中,如果要手工分析日志文件,查找、分析SQL,顯然是個(gè)體力活,MySQL提供了日志分析工具mysqldumpslow,如下
root@kickseed:/home# mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default al: average lock time ar: average rows sent at: average query time c: count l: lock time r: rows sent t: query time -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time
-s 是表示按照何種方式排序,后面可以帶如下排序方式
c: 訪問次數(shù)
l: 鎖定時(shí)間
r: 返回記錄的行數(shù)
t: 查詢時(shí)間
al:平均鎖定時(shí)間
ar:平均返回記錄的行數(shù)
at:平均查詢時(shí)間
-t 是top n的意思,即為返回前面多少條的數(shù)據(jù)
-g 后邊可以寫一個(gè)正則匹配模式,大小寫不敏感的
例子
得到返回記錄行數(shù)最多的10條SQL語(yǔ)句(行數(shù)最多排序需要 -s r ;限制10條需要 -t 10)
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log
得到訪問次數(shù)最多的10個(gè)SQL(訪問次數(shù)最多排序需要 -s c ;限制10條需要 -t 10)
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log
得到按照?qǐng)?zhí)行時(shí)間排序的前10條,且sql語(yǔ)句里面含有左連接的查詢語(yǔ)句(執(zhí)行時(shí)間排序需要 -s t;限制10條需要 -t 10)
mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log
另外建議在使用這些命令時(shí)結(jié)合 | 和more 使用 ,否則有可能出現(xiàn)刷屏的情況。
mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more
筆者以自己的慢日志為例,做一次查詢
mysqldumpslow -s t -t 5 kickseed-slow.log 表我要分析kickseed-slow.log文件,該文件是mysql的慢日志文件,得到按照?qǐng)?zhí)行時(shí)間,從大到小排序,最多5條sql語(yǔ)句
root@kickseed:/var/lib/mysql# mysqldumpslow -s t -t 5 kickseed-slow.log Reading mysql slow query log from kickseed-slow.log Count: 2 Time=2.00s (4s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@localhost select sleep(N) Count: 3 Time=0.21s (0s) Lock=0.00s (0s) Rows=25.0 (75), root[root]@[192.168.54.28] SHOW TABLE STATUS FROM `hyj_player` Count: 1 Time=0.21s (0s) Lock=0.00s (0s) Rows=23211.0 (23211), root[root]@[192.168.54.28] SELECT * FROM `hyj_player`.`t_player_basic_data` LIMIT N, N Count: 1 Time=0.20s (0s) Lock=0.00s (0s) Rows=24211.0 (24211), root[root]@[192.168.54.28] SELECT * FROM t_player_basic_data Count: 4 Time=0.02s (0s) Lock=0.00s (0s) Rows=1.0 (4), root[root]@[192.168.54.28] SELECT COUNT(*) FROM t_player_basic_data WHERE playerID < N
從返回的結(jié)果中可以看到,從最大耗時(shí)的2秒,到最小耗時(shí)的0.02秒,一共5條記錄
到此這篇關(guān)于mysql慢查詢mysqldumpslow的使用詳解的文章就介紹到這了,更多相關(guān)mysql內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL安裝提示配置信息已損壞請(qǐng)聯(lián)系技術(shù)人員
為了重新安裝MySql,看別人的博客說在注冊(cè)表中搜索mysql,全部刪除。再安裝時(shí)提示配置信息已損壞,遇到這個(gè)問題怎么處理呢,下面小編給大家?guī)砹嗽敿?xì)解決方法,感興趣的朋友一起看看吧2023-01-01線上MYSQL同步報(bào)錯(cuò)故障處理方法總結(jié)(必看篇)
下面小編就為大家?guī)硪黄€上MYSQL同步報(bào)錯(cuò)故障處理方法總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03詳解MySQL導(dǎo)出指定表中的數(shù)據(jù)的實(shí)例
這篇文章主要介紹了詳解MySQL導(dǎo)出指定表中的數(shù)據(jù)的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09mysql Community Server 5.7.19安裝指南(詳細(xì))
這篇文章主要介紹了mysql Community Server 5.7.19安裝指南(詳細(xì)),需要的朋友可以參考下2017-10-10mysql連接查詢、聯(lián)合查詢、子查詢?cè)砼c用法實(shí)例詳解
這篇文章主要介紹了mysql連接查詢、聯(lián)合查詢、子查詢?cè)砼c用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql連接查詢、聯(lián)合查詢、子查詢的基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04centos7.4系統(tǒng)中yum源安裝mysql 5.6
本文給大家介紹的是如何在centos7.4系統(tǒng)中通過yum源安裝MySQL 5.6數(shù)據(jù)庫(kù),CentOS7默認(rèn)數(shù)據(jù)庫(kù)是mariadb, 但是 好多用的都是mysql ,但是CentOS7的yum源中默認(rèn)好像是沒有mysql的,今天我們就來看看具體如何操作2018-09-09使用bin-log日志還原數(shù)據(jù)庫(kù)的例子
使用bin-log日志還原數(shù)據(jù)庫(kù)的例子,供大家學(xué)習(xí)參考2013-02-02解決MySQL innoDB間隙鎖產(chǎn)生的死鎖問題
線上經(jīng)常偶發(fā)死鎖問題,當(dāng)時(shí)處理一張表,也沒有聯(lián)表處理,但是有兩個(gè)mq入口,并且消息體存在一樣的情況,但是是偶發(fā)的,又模擬不出來什么場(chǎng)景會(huì)導(dǎo)致死鎖,只能進(jìn)行代碼分析,問題還原的方式去排查問題,本文給大家介紹了如何解決MySQL innoDB間隙鎖產(chǎn)生的死鎖問題2023-10-10Mysql數(shù)據(jù)庫(kù)之索引優(yōu)化
MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經(jīng)成為絕大多數(shù)互聯(lián)網(wǎng)公司的首選關(guān)系型數(shù)據(jù)庫(kù)。本文給大家介紹mysql數(shù)據(jù)庫(kù)之索引優(yōu)化,感興趣的朋友一起學(xué)習(xí)吧2016-03-03