分析慢SQL的步驟
- 慢查詢的開啟并捕獲:開啟慢查詢?nèi)罩?,設(shè)置閾值,比如超過5秒鐘的就是慢SQL,至少跑1天,看看生產(chǎn)的慢SQL情況,并將它抓取出來
- explain + 慢SQL分析
- show Profile。(比explain還要詳細,可以查詢SQL在MySQL數(shù)據(jù)庫中的執(zhí)行細節(jié)和生命周期情況)
- 運維經(jīng)理 OR DBA,進行MySQL數(shù)據(jù)庫服務(wù)器的參數(shù)調(diào)優(yōu)。(后端程序員沒有這個權(quán)限)
慢查詢?nèi)罩荆ǘㄎ宦齭ql)
基本介紹
慢查詢?nèi)罩臼鞘裁矗?/h4>
MySQL的慢查詢?nèi)罩臼荕ySQL提供的一種日志記錄,它用來記錄在MySQL中響應(yīng)時間超過閾值的語句,具體指運行時間超過long_query_time
值的SQL,則會被記錄到慢查詢?nèi)罩局小?/p>
-
long_query_time
的默認(rèn)值為10,意思是運行10秒以上的語句 - 由慢查詢?nèi)罩緛聿榭茨男㏒QL超出了我們的最大忍耐時間值,比如一條SQL執(zhí)行超過5秒鐘,我們就算慢SQL,希望能收集超過5秒鐘的SQL,結(jié)合之前
explain
進行全面分析
特別說明
**默認(rèn)情況下,MySQL數(shù)據(jù)庫沒有開啟慢查詢?nèi)罩荆?*需要我們手動來設(shè)置這個參數(shù)。
當(dāng)然,如果不是調(diào)優(yōu)需要的話,一般不建議啟動該參數(shù),因為開啟慢查詢?nèi)罩緯蚨嗷蛏賻硪欢ǖ男阅苡绊?。慢查詢?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重啟后會失效。
-- 指定數(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)罩居谰瞄_啟(不推薦,浪費性能),需要修改my.cnf
文件,在[mysqld]
下增加修改參數(shù)。
# my.cnf
[mysqld]
# 開啟慢查詢
slow_query_log=ON
# 指定存儲慢查詢?nèi)罩镜奈募H绻@個文件不存在,會自動創(chuàng)建
slow_query_log_file=/var/lib/mysql/slow.log
設(shè)置慢SQL的時間閾值
查看閾值
時間閾值是由參數(shù)long_query_time
控制的,默認(rèn)情況下long_query_time
的值為10秒。
MySQL中查看long_query_time
的時間: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)
注意:是超過閾值才會被記錄,等于不會被記錄
設(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:實際查詢時間,單位是秒
- Lock_time:鎖時間
- select sleep(4):超時的語句
日志分析工具mysqldumpslow
在生產(chǎn)環(huán)境中,如果要手工分析日志,查找、分析SQL,顯然是個體力活,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 # 平均鎖定時間
ar: average rows sent # 平均返回記錄數(shù)
at: average query time # 平均查詢時間
c: count # 訪問次數(shù)
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
常用命令案例
日志文件地址:/var/lib/mysql/slow.log文章來源:http://www.zghlxwxcb.cn/news/detail-545046.html
# 得到返回記錄集最多的10個SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log
# 得到訪問次數(shù)最多的10個SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log
# 得到按照時間排序的前10條里面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log
# 另外建議使用這些命令時結(jié)合|和more使用,否則出現(xiàn)爆屏的情況
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log | more
文章說明
本文章為本人學(xué)習(xí)尚硅谷的學(xué)習(xí)筆記,文章中大部分內(nèi)容來源于尚硅谷視頻(點擊學(xué)習(xí)尚硅谷相關(guān)課程),也有部分內(nèi)容來自于自己的思考,發(fā)布文章是想幫助其他學(xué)習(xí)的人更方便地整理自己的筆記或者直接通過文章學(xué)習(xí)相關(guān)知識,如有侵權(quán)請聯(lián)系刪除,最后對尚硅谷的優(yōu)質(zhì)課程表示感謝。文章來源地址http://www.zghlxwxcb.cn/news/detail-545046.html
到了這里,關(guān)于【MYSQL高級】Mysql找出執(zhí)行慢的SQL【慢查詢?nèi)罩臼褂门c分析】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!