1. 程式人生 > 資料庫 >MySQL慢查詢如何定位詳解

MySQL慢查詢如何定位詳解

前言

相信大家在平時工作中都有過 SQL 優化經歷,那麼在優化前就必須找到慢 SQL 方可進行分析。這篇文章就介紹下如何定位到慢查詢。

慢查詢日誌是 MySQL 內建的一項功能,可以記錄執行超過指定時間的 SQL 語句。

以下是慢查詢的相關引數,大家感興趣的可以看下:


引數 含義
log_output 日誌輸出位置,預設為 FILE,即儲存為檔案,若設定為 TABLE,則將日誌記錄到 mysql.show_log 表中,支援設定多種格式
slow_query_log_file 指定慢查詢日誌檔案的路徑和名字,可使用絕對路徑指定,預設值是主機名-slow.log,位於配置的 datadir 目錄
long_query_time 執行時間超過該值才記錄到慢查詢日誌,單位為秒,預設為 10
min_examined_row_limit 對於查詢掃描行數小於此引數的SQL,將不會記錄到慢查詢日誌中,預設為 0
log_queries_not_using_indexes 是否將未使用索引的 SQL 記錄到慢查詢日誌中,開啟此配置後會無視 long_query_time 引數,預設為 OFF
log_throttle_queries_not_using_indexes 設定每分鐘記錄到日誌的未使用索引的語句數目,超過這個數目後只記錄語句數量和花費的總時間,預設為 0
log-slow-admin-statements 記錄執行緩慢的管理 SQL,如 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE,預設為 OFF
log_slow_slave_statements 記錄從庫上執行的慢查詢語句,如果 binlog 的值為 row,則失效,預設為 OFF

開啟慢查詢

有兩種方式可以開啟慢查詢

  1. 修改配置檔案
  2. 設定全域性變數

方式一需要修改配置檔案 my.ini,在[mysqld]段落中加入如下引數:

[mysqld]
log_output='FILE,TABLE'
slow_query_log='ON'
long_query_time=0.001

然後需要重啟 MySQL 才可以生效,命令為 service mysqld restart

方式二無需重啟即可生效,但是重啟會導致設定失效,設定的命令如下所示:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL log_output = 'FILE,TABLE';
SET GLOBAL long_query_time = 0.001;

這樣就可以將慢查詢日誌同時記錄在檔案以及 mysql.slow_log 表中。

通過第二種方式開啟慢查詢日誌,然後使用全表查詢語句 SELECT * FROM user

然後再查詢慢查詢日誌:SELECT * FROM mysql.slow_log,可以發現其中有這樣一條記錄:

MySQL慢查詢如何定位詳解
slow_log

其中,start_time 為執行時間,user_host 為使用者的主機名,query_time 為查詢所花費的時間,lock_time 為該查詢使用鎖的時間,rows_sent 為這條查詢返回了多少資料給客戶端,rows_examined 表示這條語句掃描了多少行,db 為資料庫,sql_text 為這條 SQL,thread_id 為執行這條查詢的執行緒 id。

這樣我們就可以通過 slow_log 表的資料進行分析,然後對 SQL 進行調優了。

以上是通過 Table 來進行分析的,下面來通過檔案的慢查詢是怎麼樣的。

如果不知道檔案儲存在哪裡,可以使用 SHOW VARIABLES LIKE '%slow_query_log_file%' 來檢視檔案儲存位置,開啟慢查詢日誌檔案,可以看出每五行表示一個慢 SQL,這樣檢視比較費事,可以使用一些工具來檢視。

MySQL慢查詢如何定位詳解
慢查詢日誌檔案

mysqldumpslow

MySQL 內建了 mysqldumpslow 這個工具來幫助我們分析慢查詢日誌檔案,Windows 環境下使用該工具需要安裝 Perl 環境。

可以通過 -help 來檢視它的命令引數:

MySQL慢查詢如何定位詳解
mysqldumpslow help

比如我們可以通過 mysqldumpslow -s t 10 LAPTOP-8817LKVE-slow.log 命令得到按照查詢時間排序的 10 條 SQL 。

MySQL慢查詢如何定位詳解
mysqldumpslow 結果

pt-query-digest

除此之外還有 pt-query-digest,這個是 Percona Toolkit 中的工具之一,下載地址:https://www.percona.com/downloads/percona-toolkit/LATEST/,如果是 Windows 系統,可以在安裝 Perl 的環境下,把指令碼下載下來:https://raw.githubusercontent.com/percona/percona-toolkit/3.x/bin/pt-query-digest

下面先對 pt-query-digest 進行簡單的介紹:

pt-query-digest 是用於分析 MySQL 慢查詢的一個第三方工具,可以分析 binlog、General log 和 slowlog,也可以通過 showprocesslist 或者通過 tcpdump 抓取的 MySQL 協議資料來進行分析,可以把分析結果輸出到檔案中,分析過程是先對查詢語句的條件進行引數化,然後對引數化以後的查詢進行分組統計,統計出各查詢的執行時間、次數、佔比等,可以藉助分析結果找出問題進行優化。

有興趣的可以先下載下來自己玩玩,將在後續的文章中對 pt-query-digest 工具進行詳細介紹。

show processlist

還有種情況是慢查詢還在執行中,慢查詢日誌裡是找不到慢 SQL 呢,這個時候可以用 show processlist 命令來尋找慢查詢,該命令可以顯示正在執行的執行緒,執行結果如下圖所示,可以根據 Time 的大小來判斷是否為慢查詢。

MySQL慢查詢如何定位詳解
show processlist

總結

這篇文章主要講解了如何定位慢查詢以及簡單介紹了 mysqldumpslow 和 pt-query-digest 工具,後續還會講解 explain 和 show profile 以及 trace 等常用的方法。

你在定位慢查詢或者優化 SQL 時,都會用到哪些方法呢?

到此這篇關於MySQL慢查詢如何定位的文章就介紹到這了,更多相關MySQL慢查詢定位內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!

參考文件

https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html