分析慢SQL的步驟
- 慢查詢的開啟并捕獲:開啟慢查詢?nèi)罩荆O(shè)置閾值,比如超過5秒鐘的就是慢SQL,至少跑1天,看看生產(chǎn)的慢SQL情況,并將它抓取出來
- explain + 慢SQL分析
- show Profile。(比explain還要詳細(xì),可以查詢SQL在MySQL數(shù)據(jù)庫中的執(zhí)行細(xì)節(jié)和生命周期情況)
- 運(yùn)維經(jīng)理 OR DBA,進(jìn)行MySQL數(shù)據(jù)庫服務(wù)器的參數(shù)調(diào)優(yōu)。(后端程序員沒有這個(gè)權(quán)限)
慢查詢?nèi)罩荆ǘㄎ宦齭ql)
基本介紹
慢查詢?nèi)罩臼鞘裁矗?/h4>
MySQL的慢查詢?nèi)罩臼荕ySQL提供的一種日志記錄,它用來記錄在MySQL中響應(yīng)時(shí)間超過閾值的語句,具體指運(yùn)行時(shí)間超過long_query_time
值的SQL,則會(huì)被記錄到慢查詢?nèi)罩局小?/p>
-
long_query_time
的默認(rèn)值為10,意思是運(yùn)行10秒以上的語句 - 由慢查詢?nèi)罩緛聿榭茨男㏒QL超出了我們的最大忍耐時(shí)間值,比如一條SQL執(zhí)行超過5秒鐘,我們就算慢SQL,希望能收集超過5秒鐘的SQL,結(jié)合之前
explain
進(jìn)行全面分析
特別說明
**默認(rèn)情況下,MySQL數(shù)據(jù)庫沒有開啟慢查詢?nèi)罩荆?*需要我們手動(dòng)來設(shè)置這個(gè)參數(shù)。
當(dāng)然,如果不是調(diào)優(yōu)需要的話,一般不建議啟動(dòng)該參數(shù),因?yàn)殚_啟慢查詢?nèi)罩緯?huì)或多或少帶來一定的性能影響。慢查詢?nèi)罩局С謱⑷罩居涗泴懭胛募?/p>
查看慢查詢?nèi)罩臼欠耖_以及如何開啟
- 查看慢查詢?nèi)罩臼欠耖_啟:
SHOW VARIABLES LIKE '%slow_query_log%';
。 - 開啟慢查詢?nèi)罩荆?code>SET GLOBAL slow_query_log = 1;。使用該方法開啟MySQL的慢查詢?nèi)罩局粚Ξ?dāng)前數(shù)據(jù)庫生效,如果MySQL重啟后會(huì)失效。
-- 指定數(shù)據(jù)庫
mysql> use advanced_mysql_learning;
Database changed
-- 查看慢查詢?nèi)罩臼欠耖_啟
mysql> SHOW VARIABLES LIKE '%slow_query_log%';
+---------------------+---------------------------------------------------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | D:\Development\Sql\Mysql\mysql8\exe\mysql-8.0.27-winx64\data\dam-slow.log |
+---------------------+---------------------------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)
-- 開啟慢查詢?nèi)罩?/span>
mysql> SET GLOBAL slow_query_log = 1;
Query OK, 0 rows affected (0.01 sec)
如果要使慢查詢?nèi)罩居谰瞄_啟(不推薦,浪費(fèi)性能),需要修改my.cnf
文件,在[mysqld]
下增加修改參數(shù)。
# my.cnf
[mysqld]
# 開啟慢查詢
slow_query_log=ON
# 指定存儲(chǔ)慢查詢?nèi)罩镜奈募H绻@個(gè)文件不存在,會(huì)自動(dòng)創(chuàng)建
slow_query_log_file=/var/lib/mysql/slow.log
設(shè)置慢SQL的時(shí)間閾值
查看閾值
時(shí)間閾值是由參數(shù)long_query_time
控制的,默認(rèn)情況下long_query_time
的值為10秒。
MySQL中查看long_query_time
的時(shí)間:SHOW VARIABLES LIKE 'long_query_time%';
。
mysql> SHOW VARIABLES LIKE 'long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set, 1 warning (0.00 sec)
注意:是超過閾值才會(huì)被記錄,等于不會(huì)被記錄
設(shè)置閾值
-- 設(shè)置閾值
mysql> set global long_query_time=3;
Query OK, 0 rows affected (0.00 sec)
-- 可以發(fā)現(xiàn)設(shè)置沒有成功
mysql> SHOW VARIABLES LIKE 'long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set, 1 warning (0.00 sec)
也可以不重啟連接,使用如下命令直接查看
show global variables like 'long_query_time';
也直接在my.cnf配置文件中修改
[mysqld]
long_query_time=1
查詢慢查詢?nèi)罩疚募械目傆涗洍l數(shù)
mysql> SHOW GLOBAL STATUS LIKE '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 0 |
+---------------+-------+
1 row in set (0.00 sec)
日志分析
模擬慢查詢
mysql> select sleep(4);
+----------+
| sleep(4) |
+----------+
| 0 |
+----------+
1 row in set (4.01 sec)
# Time: 2023-06-22T03:40:45.171751Z
# User@Host: root[root] @ localhost [::1] Id: 8
# Query_time: 4.004906 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1
use advanced_mysql_learning;
SET timestamp=1687405241;
select sleep(4);
- use advanced_mysql_learning:使用的數(shù)據(jù)庫
- Query_time:實(shí)際查詢時(shí)間,單位是秒
- Lock_time:鎖時(shí)間
- select sleep(4):超時(shí)的語句
日志分析工具mysqldumpslow
在生產(chǎn)環(huán)境中,如果要手工分析日志,查找、分析SQL,顯然是個(gè)體力活,MySQL提供了日志分析工具mysqldumpslow
。比如有100條慢sql,如何快速找出出現(xiàn)頻次最高的前5條。
查看mysqldumpslow的幫助文檔
在Linux命令行窗口執(zhí)行mysqldumpslow --help
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 # 平均鎖定時(shí)間
ar: average rows sent # 平均返回記錄數(shù)
at: average query time # 平均查詢時(shí)間
c: count # 訪問次數(shù)
l: lock time # 鎖定時(shí)間
r: rows sent # 返回記錄
t: query time # 查詢時(shí)間
-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
常用命令案例
日志文件地址:/var/lib/mysql/slow.log文章來源:http://www.zghlxwxcb.cn/news/detail-505737.html
# 得到返回記錄集最多的10個(gè)SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log
# 得到訪問次數(shù)最多的10個(gè)SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log
# 得到按照時(shí)間排序的前10條里面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log
# 另外建議使用這些命令時(shí)結(jié)合|和more使用,否則出現(xiàn)爆屏的情況
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log | more
文章說明
本文章為本人學(xué)習(xí)尚硅谷的學(xué)習(xí)筆記,文章中大部分內(nèi)容來源于尚硅谷視頻(點(diǎn)擊學(xué)習(xí)尚硅谷相關(guān)課程),也有部分內(nèi)容來自于自己的思考,發(fā)布文章是想幫助其他學(xué)習(xí)的人更方便地整理自己的筆記或者直接通過文章學(xué)習(xí)相關(guān)知識(shí),如有侵權(quán)請聯(lián)系刪除,最后對尚硅谷的優(yōu)質(zhì)課程表示感謝。文章來源地址http://www.zghlxwxcb.cn/news/detail-505737.html
到了這里,關(guān)于Mysql找出執(zhí)行慢的SQL【慢查詢?nèi)罩臼褂门c分析】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!