1. 程式人生 > 其它 >MySql慢查詢SQL排查設定

MySql慢查詢SQL排查設定

0. 前言

假設一次執行20條SQL,我們如何判斷哪條SQL是執行慢的爛SQL,這裡就需要用到慢查詢日誌

在SQL中,廣義的查詢就是crud操作,而狹義的查詢僅僅是select查詢操作,慢查詢指的是廣義的查詢,包括增刪改查,一般是查詢,所以稱為慢查詢。

1. 什麼是慢查詢日誌?

MySQL提供的一種日誌記錄,用於記錄MySQL中響應時間超過閾值[yù zhí]的SQL語句(long_query_time,預設10秒)

慢查詢日誌預設是關閉的,開啟會消耗一定的效能,一般是開發調優時開啟,而部署時會關閉。

2. 檢查是否開啟了慢查詢日誌

執行語句:

show variables like '%slow_query_log'
;

預設是OFF關閉狀態

3. 如何開啟慢查詢日誌?

有兩種開啟方式,臨時開啟永久開啟

3.1 臨時開啟

一般使用臨時開啟,即在記憶體中開啟,MySQL退出就自動關閉。

set global slow_query_log = 1; 
set global slow_query_log_file="D:/MySQL Server 5.5/slow_query_log.log";

臨時開啟,重啟MySQL服務會變成OFF狀態

Linux:

service mysql restart

Windows:

右擊開始選單——計算機管理——找到MySQL服務——重啟:

重啟後的可以看到變成關閉狀態:

3.2 永久開啟

修改配置檔案

Linux:/etc/my.cnf 中追加配置

vi /etc/my.cnf

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/localhost-slow-query-log.log

Windows:D:\MySQL Server 5.5\my.ini

[mysqld]
slow_query_log=1
slow_query_log_file="D:/MySQL Server 5.5/slow_query_log.log"

4. 慢查詢閾值修改

4.1 檢視預設值
show variables like
'%long_query_time%';
4.2 臨時設定閾值

設定完畢後,需要重新登入MySQL才能生效(注意是重新登入MySQL,不是重啟MySQL服務)

set global long_query_time = 5;
4.3 永久設定閾值

配置檔案,修改完成後需要重啟MySQL服務

[mysqld]
long_query_time=3

5. 慢SQL排查測試

5.1 模擬慢SQL資料

執行如下SQL語句休眠4秒,模擬慢SQL:

select sleep(4);

查詢超過閾值的SQL的數量:

show global status like '%slow_queries%';
5.2 查詢超過閾值的具體SQL語句
  1. 通過檢視日誌檔案,也就是前面設定的slow_query_log_file:
  1. 通過mysqldumpslow工具檢視慢SQL

作用:假設執行了1000條SQL,其中有30條SQL都超過了閾值,如果直接檢視日誌檔案,無法快速定位到具體的SQL,因此mysqldumpslow可以通過一些過濾條件,快速查找出需要定位的慢SQL。

Linux:

mysqldumpslow命令

檢視幫助文件:

mysqldumpslow --help
-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)
-l:鎖定時間 don't subtract lock time from total time
-g:後面跟一個正則匹配模式,大小寫不敏感
-t:top n,即為返回前面多少條的資料

例子:

  • 獲取返回記錄最多的3個SQL

    mysqldumpslow -s r -t 3 /var/lib/mysql/localhost-slow-query-log.log
    
  • 獲取訪問次數最多的3個SQL

    mysqldumpslow -s c -t 3 /var/lib/mysql/localhost-slow-query-log.log
    
  • 按照時間排序,前10條包含left join查詢語句的SQL

    mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow-query-log.log
    

Windows:

MySQL安裝後以後在bin下有mysqldumpslow.pl檔案,如果沒有可以自行下載

D:\MySQL Server 5.5\bin\mysqldumpslow.pl

mysqldumpslow是一個perl指令碼,要想在Windows執行,首先需要安裝Perl

安裝過程很簡單,從官網 http://strawberryperl.com/ 下載windows安裝包,安裝完成後通過perl -v命令測試是否安裝成功,如果能顯示版本號,表示安裝成功。

百度網盤:

連結:https://pan.baidu.com/s/1MiJ3FNUGEoSE1U6dJzOsAg
提取碼:slt7

檢視幫助文件:

perl mysqldumpslow.pl --help

例子:

  • 獲取返回記錄最多的3個SQL

    perl mysqldumpslow.pl -s r -t 3 "D:/MySQL Server 5.5/slow_query_log.log"
    
  • 獲取訪問次數最多的3個SQL

    perl mysqldumpslow.pl -s c -t 3 "D:/MySQL Server 5.5/slow_query_log.log"
    
  • 按照時間排序,前10條包含left join查詢語句的SQL

    perl mysqldumpslow.pl -s t -t 10 -g "left join" "D:/MySQL Server 5.5/slow_query_log.log"
    

0. 前言

假設一次執行20條SQL,我們如何判斷哪條SQL是執行慢的爛SQL,這裡就需要用到慢查詢日誌

在SQL中,廣義的查詢就是crud操作,而狹義的查詢僅僅是select查詢操作,慢查詢指的是廣義的查詢,包括增刪改查,一般是查詢,所以稱為慢查詢。

1. 什麼是慢查詢日誌?

MySQL提供的一種日誌記錄,用於記錄MySQL中響應時間超過閾值[yù zhí]的SQL語句(long_query_time,預設10秒)

慢查詢日誌預設是關閉的,開啟會消耗一定的效能,一般是開發調優時開啟,而部署時會關閉。

2. 檢查是否開啟了慢查詢日誌

執行語句:

show variables like '%slow_query_log';

預設是OFF關閉狀態

3. 如何開啟慢查詢日誌?

有兩種開啟方式,臨時開啟永久開啟

3.1 臨時開啟

一般使用臨時開啟,即在記憶體中開啟,MySQL退出就自動關閉。

set global slow_query_log = 1; 
set global slow_query_log_file="D:/MySQL Server 5.5/slow_query_log.log";

臨時開啟,重啟MySQL服務會變成OFF狀態

Linux:

service mysql restart

Windows:

右擊開始選單——計算機管理——找到MySQL服務——重啟:

重啟後的可以看到變成關閉狀態:

3.2 永久開啟

修改配置檔案

Linux:/etc/my.cnf 中追加配置

vi /etc/my.cnf

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/localhost-slow-query-log.log

Windows:D:\MySQL Server 5.5\my.ini

[mysqld]
slow_query_log=1
slow_query_log_file="D:/MySQL Server 5.5/slow_query_log.log"

4. 慢查詢閾值修改

4.1 檢視預設值
show variables like '%long_query_time%';
4.2 臨時設定閾值

設定完畢後,需要重新登入MySQL才能生效(注意是重新登入MySQL,不是重啟MySQL服務)

set global long_query_time = 5;
4.3 永久設定閾值

配置檔案,修改完成後需要重啟MySQL服務

[mysqld]
long_query_time=3

5. 慢SQL排查測試

5.1 模擬慢SQL資料

執行如下SQL語句休眠4秒,模擬慢SQL:

select sleep(4);

查詢超過閾值的SQL的數量:

show global status like '%slow_queries%';
5.2 查詢超過閾值的具體SQL語句
  1. 通過檢視日誌檔案,也就是前面設定的slow_query_log_file:
  1. 通過mysqldumpslow工具檢視慢SQL

作用:假設執行了1000條SQL,其中有30條SQL都超過了閾值,如果直接檢視日誌檔案,無法快速定位到具體的SQL,因此mysqldumpslow可以通過一些過濾條件,快速查找出需要定位的慢SQL。

Linux:

mysqldumpslow命令

檢視幫助文件:

mysqldumpslow --help
-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)
-l:鎖定時間 don't subtract lock time from total time
-g:後面跟一個正則匹配模式,大小寫不敏感
-t:top n,即為返回前面多少條的資料

例子:

  • 獲取返回記錄最多的3個SQL

    mysqldumpslow -s r -t 3 /var/lib/mysql/localhost-slow-query-log.log
    
  • 獲取訪問次數最多的3個SQL

    mysqldumpslow -s c -t 3 /var/lib/mysql/localhost-slow-query-log.log
    
  • 按照時間排序,前10條包含left join查詢語句的SQL

    mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow-query-log.log
    

Windows:

MySQL安裝後以後在bin下有mysqldumpslow.pl檔案,如果沒有可以自行下載

D:\MySQL Server 5.5\bin\mysqldumpslow.pl

mysqldumpslow是一個perl指令碼,要想在Windows執行,首先需要安裝Perl

安裝過程很簡單,從官網 http://strawberryperl.com/ 下載windows安裝包,安裝完成後通過perl -v命令測試是否安裝成功,如果能顯示版本號,表示安裝成功。

百度網盤:

連結:https://pan.baidu.com/s/1MiJ3FNUGEoSE1U6dJzOsAg
提取碼:slt7

檢視幫助文件:

perl mysqldumpslow.pl --help

例子:

  • 獲取返回記錄最多的3個SQL

    perl mysqldumpslow.pl -s r -t 3 "D:/MySQL Server 5.5/slow_query_log.log"
    
  • 獲取訪問次數最多的3個SQL

    perl mysqldumpslow.pl -s c -t 3 "D:/MySQL Server 5.5/slow_query_log.log"
    
  • 按照時間排序,前10條包含left join查詢語句的SQL

    perl mysqldumpslow.pl -s t -t 10 -g "left join" "D:/MySQL Server 5.5/slow_query_log.log"
    

出處:https://www.cnblogs.com/caituotuo/p/16220157.html