詳解MySQL查看執(zhí)行慢的SQL語句(慢查詢)
慢查詢?nèi)罩?/h2>
查看執(zhí)行慢的SQL語句,需要先開啟慢查詢?nèi)罩尽?br />MySQL 的慢查詢?nèi)罩荆涗浽?MySQL 中響應(yīng)時(shí)間超過閥值的語句(具體指運(yùn)行時(shí)間超過 long_query_time
值的SQL。long_query_time 的默認(rèn)值為10,意思是運(yùn)行10秒以上(不含10秒)的語句)。
目的:發(fā)現(xiàn)執(zhí)行時(shí)間特別長(zhǎng)的SQL查詢,進(jìn)行優(yōu)化。
默認(rèn)情況下,MySQL數(shù)據(jù)庫(kù)沒有開啟慢查詢?nèi)罩?,需要我們手?dòng)來設(shè)置這個(gè)參數(shù)。
慢日志常用配置項(xiàng)
slow_query_log 是否啟用慢查詢?nèi)罩?,默認(rèn)為0,可設(shè)置為0、1,1表示開啟。 slow_query_log_file 指定慢查詢?nèi)罩疚恢眉懊Q,默認(rèn)值為host_name-slow.log,可指定絕對(duì)路徑。 long_query_time 慢查詢執(zhí)行時(shí)間閾值,超過此時(shí)間會(huì)記錄,默認(rèn)為10,單位為s。 log_output 慢查詢?nèi)罩据敵瞿繕?biāo),默認(rèn)為file,即輸出到文件。 log_timestamps 主要是控制 error log、slow log、genera log 日志文件中的顯示時(shí)區(qū),默認(rèn)使用UTC時(shí)區(qū),建議改為 SYSTEM 系統(tǒng)時(shí)區(qū)。 log_queries_not_using_indexes 是否記錄所有未使用索引的查詢語句,默認(rèn)為off。 min_examined_row_limit 對(duì)于查詢掃描行數(shù)小于此參數(shù)的SQL,將不會(huì)記錄到慢查詢?nèi)罩局?,默認(rèn)為0。 log_slow_admin_statements 慢速管理語句是否寫入慢日志中,管理語句包含 alter table、create index 等,默認(rèn)為 off 即不寫入
一般情況下,我們只需開啟慢日志記錄,配置下閾值時(shí)間,其余參數(shù)可按默認(rèn)配置。對(duì)于閾值時(shí)間,可靈活調(diào)整,比如說可以設(shè)置為 1s 或 3s 。
查看是否開啟慢查詢?nèi)罩?/h3>
show variables like '%slow_query_log%';
show variables like '%slow_query_log%';
開啟慢查詢(臨時(shí),當(dāng)前會(huì)話有效)
set global slow_query_log='ON';
查看慢查詢?nèi)罩敬娣盼募恢?/h3>
show variables like '%slow_query_log_file%';
show variables like '%slow_query_log_file%';
查看long_query_time閾值
show variables like '%long_query_time%';
設(shè)置long_query_time閾值(臨時(shí),當(dāng)前會(huì)話有效)
set global long_query_time=3
直接修改配置文件(全局,需要重啟服務(wù),慎重)
#編輯配置文件 vim /etc/my.cnf # 修改配置項(xiàng)(如果沒有就加上) [mysqld] slow_query_log = ON slow_query_log_file = /var/lib/mysql/my-slow.log long_query_time = 1 log_timestamps = SYSTEM log_output = FILE # 重啟mysqld服務(wù) systemctl restart mysqld # 查看mysqld服務(wù) systemctl status mysqld
測(cè)試
select sleep(5); ls /var/lib/mysql/xxx-slow.log
慢查詢?nèi)罩疚募治?/h2>
單條記錄結(jié)構(gòu)
單條記錄結(jié)構(gòu):
# Time: 2024-03-01T17:12:40.156488+08:00 # User@Host: panda[panda] @ [192.168.72.1] Id: 8 # Query_time: 5.000688 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 SET timestamp=1709284355; select sleep(5);
字段說明:
慢查詢?nèi)罩疽?作為起始符。
Time:查詢的時(shí)間。
User@Host:表示用戶 和 慢查詢查詢的ip地址。
如上所述,表示 root用戶 localhost地址。
Query_time: 表示SQL查詢持續(xù)時(shí)間, 單位 (秒)。
Lock_time: 表示獲取鎖的時(shí)間, 單位(秒)。
Rows_sent: 表示發(fā)送給客戶端的行數(shù)。
Rows_examined: 表示:服務(wù)器層檢查的行數(shù)。
set timestamp :表示 慢SQL 記錄時(shí)的時(shí)間戳。
最后 select sleep(5) 則表示慢SQL語句。
慢查詢?nèi)罩痉治?mysqldumpslow
MySQL自帶了一個(gè)慢查詢分析工具mysqldumpslow。
試了下不太好使。可以試試:
Navicat Monitor、signoz、hertzbeat 這些性能監(jiān)測(cè)工具。
mysqldumpslow -s c -t 10 /var/run/mysqld/mysqld-slow.log # 取出使用最多的10條慢查詢 mysqldumpslow -s t -t 3 /var/run/mysqld/mysqld-slow.log # 取出查詢時(shí)間最慢的3條慢查詢 mysqldumpslow -s t -t 10 -g “l(fā)eft join” /database/mysql/slow-log #得到按照時(shí)間排序的前10條里面含有左連接的查詢語句 mysqldumpslow -s r -t 10 -g 'left join' /var/run/mysqld/mysqldslow.log # 按照掃描行數(shù)最多的
慢查詢?nèi)罩痉治?Navicat Monitor
官網(wǎng)下載就行了。跟著指引配置即可。
很舒服,還可以自動(dòng)提供一些運(yùn)維建議。
查詢分析
其他細(xì)節(jié)
記錄管理語句
在 MySQL 中,慢查詢?nèi)罩局心J(rèn)不記錄管理語句,如:
alter table, analyze table,check table
不過可通過以下屬性進(jìn)行設(shè)置:
mysql> set global log_slow_admin_statements = "ON";
記錄未走索引的SQL語句
在 MySQL 中,還可以設(shè)置將未走索引的SQL語句記錄在慢日志查詢文件中(默認(rèn)為關(guān)閉狀態(tài))。通過下述屬性即可進(jìn)行設(shè)置:
mysql> set global log_queries_not_using_indexes = "ON"; Query OK, 0 rows affected (0.00 sec)
SQL 復(fù)制 全屏
慢查詢?nèi)罩据敵鑫恢?/h3>
在MySQL中,日志輸出格式有支持:FILE(默認(rèn)),TABLE 兩種,可進(jìn)行組合使用。如下所示:
set global log_output = "FILE,TABLE";
這樣設(shè)置會(huì)同時(shí)在 FILE, mysql庫(kù)中的slow_log表中同時(shí)寫入。
select * from mysql.slow_log;
參考資料
https://www.navicat.com.cn/company/aboutus/blog/456-使用-mysql-慢速查詢?nèi)罩?html
到此這篇關(guān)于MySQL查看執(zhí)行慢的SQL語句(慢查詢)的文章就介紹到這了,更多相關(guān)MySQL查看SQL語句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql5.7.19 winx64安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細(xì)介紹了mysql5.7.19 winx64安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07select count()和select count(1)的區(qū)別和執(zhí)行方式講解
今天小編就為大家分享一篇關(guān)于select count()和select count(1)的區(qū)別和執(zhí)行方式講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03Mysql報(bào)錯(cuò)too many connections的原因及解決方案
這篇文章主要給大家介紹了關(guān)于Mysql報(bào)錯(cuò)too many connections原因及解決方案,文中通過實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09C#如何在海量數(shù)據(jù)下的高效讀取寫入MySQL
這篇文章主要介紹了C#如何在海量數(shù)據(jù)下的高效讀取寫入MySQL的相關(guān)資料,需要的朋友可以參考下2016-12-12詳解MySQL數(shù)據(jù)庫(kù)insert和update語句
用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢語句,也就是我們所說的SELECT語句,另外一種就是更新語句,也叫做數(shù)據(jù)操作語句。接下來通過本文給大家介紹MySQL數(shù)據(jù)庫(kù)insert和update語句,需要的朋友一起學(xué)習(xí)吧2016-04-04