【MySQL】慢查詢的配置與使用

目錄

1 什麼是慢查詢

2 慢查詢配置

2.1 慢查詢基本配置

2.2 慢查詢解讀

3 慢查詢分析

3.1 Mysqldumpslow

3.2 pt_query_digest

3.2.1 擴展閱讀


1 什麼是慢查詢

慢查詢日誌,顧名思義,就是查詢的比較慢的日誌,是指mysql記錄所有執行超過long_query_time參數設定的時間閾值的SQL語句的日誌。該日誌能爲SQL語句的優化帶來很好的幫助。默認情況下,慢查詢日誌是關閉的,要使用慢查詢日誌功能,首先要開啓慢查詢日誌功能。

查詢優化的過程就是先用慢查詢找到所有SQL語句中查詢比較慢的語句,然後再針對這些SQL語句使用explain執行計劃進行分析進而進行相應的優化。

 

2 慢查詢配置

2.1 慢查詢基本配置

  • slow_query_log 啓動停止技術慢查詢日誌
  • slow_query_log_file 指定慢查詢日誌得存儲路徑及文件(默認和數據文件放一起)
  • long_query_time 指定記錄慢查詢日誌SQL執行時間得閾值(單位:秒,默認10秒)
  • log_queries_not_using_indexes  是否記錄未使用索引的SQL
  • log_output 日誌存放的地方【TABLE】【FILE】【FILE,TABLE】

 

配置了慢查詢後,它會記錄符合條件的SQL

包括:

  • 查詢語句
  • 數據修改語句
  • 已經回滾得SQL

 

實操:

通過下面命令查看下上面的配置:

show VARIABLES like '%slow_query_log%'
 
show VARIABLES like '%slow_query_log_file%'
 
show VARIABLES like '%long_query_time%'
 
show VARIABLES like '%log_queries_not_using_indexes%'
 
show VARIABLES like 'log_output'
 
 
set global long_query_time=0;   ---默認10秒,這裏爲了演示方便設置爲0 
 
set GLOBAL  slow_query_log = 1; --開啓慢查詢日誌
 
set global log_output='FILE,TABLE'  --項目開發中日誌只能記錄在日誌文件中,不能記表中

設置完成後,查詢一些列表可以發現慢查詢的日誌文件裏面有數據了。

 

2.2 慢查詢解讀

從慢查詢日誌裏面摘選一條慢查詢日誌,數據組成如下

 

慢查詢格式顯示

 

行號

內容

1

用戶名 、用戶的IP信息、線程ID號

2

執行花費的時間【單位:毫秒】

3

執行獲得鎖的時間

4

獲得的結果行數

5

掃描的數據行數

6

這SQL執行的具體時間

7

具體的SQL語句

 

 

3 慢查詢分析

慢查詢的日誌記錄非常多,要從裏面找尋一條查詢慢的日誌並不是很容易的事情,一般來說都需要一些工具輔助才能快速定位到需要優化的SQL語句,下面介紹兩個慢查詢輔助工具

 

3.1 Mysqldumpslow

常用的慢查詢日誌分析工具,彙總除查詢條件外其他完全相同的SQL,並將分析結果按照參數中所指定的順序輸出。該工具就在MySQL安裝目錄下的bin文件中。

語法:

mysqldumpslow -s r -t 10 slow-mysql.log
-s order (c,t,l,r,at,al,ar) 
         c:總次數
         t:總時間
         l:鎖的時間
         r:總數據行
         at,al,ar  :t,l,r平均數  【例如:at = 總時間/總次數】
 
 -t  top   指定取前面幾條作爲結果輸出

 

mysqldumpslow.pl -s t -t 10 D:\DESKTOP-2EKGEE5-slow.log

 

 

3.2 pt_query_digest

是用於分析mysql慢查詢的一個工具,與mysqldumpshow工具相比,py-query_digest 工具的分析結果更具體,更完善。

 

mysqldumpshow這個工具必須登錄到MySQL服務器纔可以使用,有時因爲某些原因如權限不足等,無法在服務器上記錄查詢。這樣的限制我們也常常碰到。但是py-query_digest就沒有這種問題。而且py-query_digest能夠查看執行計劃,mysqldumpshow就沒有。

 

首先來看下一個命令

 perl .\pt-query-digest  --explain h=127.0.0.1,u=root,p=root1234% D:\DESKTOP-2EKGEE5-slow.log

彙總的信息【總的查詢時間】、【總的鎖定時間】、【總的獲取數據量】、【掃描的數據量】、【查詢大小】

  • Response: 總的響應時間。
  • time: 該查詢在本次分析中總的時間佔比。
  • calls: 執行次數,即本次分析總共有多少條這種類型的查詢語句。
  • R/Call: 平均每次執行的響應時間。
  • Item : 查詢對象

 

3.2.1 擴展閱讀:

3.2.1.1 pt-query-digest語法及重要選項

pt-query-digest [OPTIONS] [FILES] [DSN]

  • --create-review-table 當使用--review參數把分析結果輸出到表中時,如果沒有表就自動創建。
  • --create-history-table 當使用--history參數把分析結果輸出到表中時,如果沒有表就自動創建。
  • --filter 對輸入的慢查詢按指定的字符串進行匹配過濾後再進行分析
  • --limit 限制輸出結果百分比或數量,默認值是20,即將最慢的20條語句輸出,如果是50%則按總響應時間佔比從大到小排序,輸出到總和達到50%位置截止。
  • --host mysql服務器地址
  • --user mysql用戶名
  • --password mysql用戶密碼
  • --history 將分析結果保存到表中,分析結果比較詳細,下次再使用--history時,如果存在相同的語句,且查詢所在的時間區間和歷史表中的不同,則會記錄到數據表中,可以通過查詢同一CHECKSUM來比較某類型查詢的歷史變化。
  • --review 將分析結果保存到表中,這個分析只是對查詢條件進行參數化,一個類型的查詢一條記錄,比較簡單。當下次使用--review時,如果存在相同的語句分析,就不會記錄到數據表中。
  • --output 分析結果輸出類型,值可以是report(標準分析報告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便於閱讀。
  • --since 從什麼時間開始分析,值爲字符串,可以是指定的某個”yyyy-mm-dd [hh:mm:ss]”格式的時間點,也可以是簡單的一個時間值:s(秒)、h(小時)、m(分鐘)、d(天),如12h就表示從12小時前開始統計。
  • --until 截止時間,配合—since可以分析一段時間內的慢查詢。

 

3.2.1.2 分析pt-query-digest輸出結果

3.2.1.2.1 第一部分:總體統計結果

  • Overall:總共有多少條查詢
  • Time range:查詢執行的時間範圍
  • unique:唯一查詢數量,即對查詢條件進行參數化以後,總共有多少個不同的查詢
  • total:總計 min:最小 max:最大 avg:平均
  • 95%:把所有值從小到大排列,位置位於95%的那個數,這個數一般最具有參考價值
  • median:中位數,把所有值從小到大排列,位置位於中間那個數

 

# 該工具執行日誌分析的用戶時間,系統時間,物理內存佔用大小,虛擬內存佔用大小
# 340ms user time, 140ms system time, 23.99M rss, 203.11M vsz
# 工具執行時間
# Current date: Fri Nov 25 02:37:18 2016
# 運行分析工具的主機名
# Hostname: localhost.localdomain
# 被分析的文件名
# Files: slow.log
# 語句總數量,唯一的語句數量,QPS,併發數
# Overall: 2 total, 2 unique, 0.01 QPS, 0.01x concurrency 
# 日誌記錄的時間範圍
# Time range: 2016-11-22 06:06:18 to 06:11:40
# 屬性    總計  最小 最大 平均 95% 標準 中等
# Attribute   total  min  max  avg  95% stddev median
# ============  ======= ======= ======= ======= ======= ======= =======
# 語句執行時間
# Exec time    3s 640ms  2s  1s  2s 999ms  1s
# 鎖佔用時間
# Lock time   1ms  0  1ms 723us  1ms  1ms 723us
# 發送到客戶端的行數
# Rows sent    5  1  4 2.50  4 2.12 2.50
# select語句掃描行數
# Rows examine  186.17k  0 186.17k 93.09k 186.17k 131.64k 93.09k
# 查詢的字符數
# Query size   455  15  440 227.50  440 300.52 227.50

 

3.2.1.2.2 第二部分:查詢分組統計結果

  • Rank:所有語句的排名,默認按查詢時間降序排列,通過--order-by指定
  • Query ID:語句的ID,(去掉多餘空格和文本字符,計算hash值)
  • Response:總的響應時間
  • time:該查詢在本次分析中總的時間佔比
  • calls:執行次數,即本次分析總共有多少條這種類型的查詢語句
  • R/Call:平均每次執行的響應時間
  • V/M:響應時間Variance-to-mean的比率
  • Item:查詢對象

 

# Profile
# Rank Query ID   Response time Calls R/Call V/M Item
# ==== ================== ============= ===== ====== ===== ===============
# 1 0xF9A57DD5A41825CA 2.0529 76.2%  1 2.0529 0.00 SELECT
# 2 0x4194D8F83F4F9365 0.6401 23.8%  1 0.6401 0.00 SELECT wx_member_base

 

3.2.1.2.3 第三部分:每一種查詢的詳細統計結果

由下面查詢的詳細統計結果,最上面的表格列出了執行次數、最大、最小、平均、95%等各項目的統計。

  • ID:查詢的ID號,和上圖的Query ID對應
  • Databases:數據庫名
  • Users:各個用戶執行的次數(佔比)
  • Query_time distribution :查詢時間分佈, 長短體現區間佔比,本例中1s-10s之間查詢數量是10s以上的兩倍。
  • Tables:查詢中涉及到的表
  • Explain:SQL語句
# Query 1: 0 QPS, 0x concurrency, ID 0xF9A57DD5A41825CA at byte 802 
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.00
# Time range: all events occurred at 2016-11-22 06:11:40
# Attribute pct total  min  max  avg  95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count   50  1
# Exec time  76  2s  2s  2s  2s  2s  0  2s
# Lock time  0  0  0  0  0  0  0  0
# Rows sent  20  1  1  1  1  1  0  1
# Rows examine 0  0  0  0  0  0  0  0
# Query size  3  15  15  15  15  15  0  15
# String:
# Databases test
# Hosts  192.168.8.1
# Users  mysql
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s ################################################################
# 10s+
# EXPLAIN /*!50100 PARTITIONS*/
select sleep(2)\G

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章