mysqldumpslow慢查詢

小亮520cl發表於2015-10-28

一直以來積累了很多對MySQL最佳化的心得和經驗,計劃透過寫日誌的方式一步一步寫出來分享給大家。

MySQL最佳化的第一步應該做的就是排查問題,找出瓶頸,而通常情況下的瓶頸和問題都需要透過觀察MySQL的執行情況來進行分析,《》這篇文章羅列了一些常用的檢視MySQL執行資訊的方式。

而對於大多數的程式設計師來說,最容易發現並解決的問題就是MySQL的慢查詢或者沒有利用索引的查詢,所以這裡主要給大家介紹如何利用官方的mysqldumpslow工具方便的檢視這些資訊。如何開啟MySQL的慢查詢,請點選《》。

mysqldumpslow命令
/path/mysqldumpslow -s c -t 10 /database/mysql/slow-log
這會輸出記錄次數最多的10條SQL語句,其中:

  • -s, 是表示按照何種方式排序,c、t、l、r分別是按照記錄次數、時間、鎖定時間、返回的記錄數來排序,ac、at、al、ar,表示相應的平均;
  • -t, 是top n的意思,即為返回前面多少條的資料;
  • -g, 後邊可以寫一個正則匹配模式,大小寫不敏感的;

比如
/path/mysqldumpslow -s r -t 10 /database/mysql/slow-log
得到返回記錄集最多的10個查詢。
/path/mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log
得到按照時間排序的前10條裡面含有左連線的查詢語句。

小結
使用mysqldumpslow命令可以非常明確的得到各種我們需要的查詢語句,對MySQL查詢語句的監控、分析、最佳化是MySQL最佳化的第一步,也是非常重要的一步。


  1. mysqldumpslow --help可顯示其引數的使用

  2. 經常使用的引數:
  3. -s,是order的順序
  4. al 平均鎖定時間
  5. ar 平均返回記錄時間
  6. at 平均查詢時間(預設)
  7. c 計數
  8. l 鎖定時間
  9. r 返回記錄
  10. t 查詢時間
  11.  

  12. -t,是top n的意思,即為返回前面多少條的資料
  13. -g,後邊可以寫一個正則匹配模式,大小寫不敏感的
  14. 例子:
  15. mysqldumpslow -t 10 -s t -g “left join” host-slow.log
  16. 使用mysqldumpslow的分析結果不會顯示具體完整的sql語句,說明:

  17. 1:假如真正的sql語句如下:
  18. SELECT * FROM sms_send WHERE service_id=10 GROUP BY content LIMIT 0, 1000;
  19.  
  20. mysqldumpslow顯示的結果會是:
  21. Count: 1 Time=1.91s (1s) Lock=0.00s (0s) Rows=1000.0 (1000), vgos_dba[vgos_dba]@[10.130.229.196]
  22. SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;
  23.  
  24. 2:如果我們再執行一條
  25. SELECT * FROM sms_send WHERE service_id=20 GROUP BY content LIMIT 10000, 1000;

  26. mysqldumpslow顯示的結果會是:
  27. Count: 2 Time=2.79s (5s) Lock=0.00s (0s) Rows=1.0 (2), vgos_dba[vgos_dba]@[10.130.229.196]
  28. SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;
  29.  
  30. 雖然這兩條語句條件不一樣,
  31. 1:一個是server_id=10,一個是server_id=20
  32. 2:一個是LIMIT 0, 1000,一個是LIMIT 10000, 1000
  33. 但是mysqldumpslow分析會認為這是一種型別的語句,會合並顯示。
  34.  
  35. 3:假設我們執行
  36. SELECT * FROM sms_send WHERE service_id<=10 GROUP BY content LIMIT 0, 1000;

  37. 執行mysqldumpslow結果是
  38. Count: 1 Time=2.91s (2s) Lock=0.00s (0s) Rows=1000.0 (1000), vgos_dba[vgos_dba]@[10.130.229.196]
  39. SELECT * FROM sms_send WHERE service_id<=N GROUP BY content LIMIT N, N;

  40. 可以看出它和上面我們寫的sql語句是兩種型別
  41. mysqldumpslow的分析結果
  42. Count會告訴我們這種型別的語句執行了幾次
  43. Time會告訴我們這種型別的語句執行的最大時間
  44. Time=2.79s (5s)中(5s)是指這型別的語句執行總共花費的時間
  45. 例:
  46. Count: 2 Time=2.79s (5s) Lock=0.00s (0s) Rows=1.0 (2), vgos_dba[vgos_dba]@[10.130.229.196]
  47.  
  48. 告訴我們執行了2次
  49. 最大時間是2.79s
  50. 總共花費時間5s
  51. lock時間0s
  52. 單次返回的結果數是1條記錄
  53. 2次總共返回2條記錄

  54. mysqldumpslow -s t -t 10 slow.log
  55. 查詢的結果是10條執行時間最慢的sql語句,其中-s t是指此類型別的語句的執
  56. 行總時長

  57. Count: 1 Time=2.91s (2s) Lock=0.00s (0s) Rows=1000.0 (1000), vgos_dba[vgos_dba]@[10.130.229.196]

  58. Count: 2 Time=2.79s (5s) Lock=0.00s (0s) Rows=1.0 (2), vgos_dba[vgos_dba]@[10.130.229.196]
  59. 比較的結果是
  60. Count: 2 Time=2.79s (5s) Lock=0.00s (0s) Rows=1.0 (2), vgos_dba[vgos_dba]@[10.130.229.196]
  61. 排在前面,因為比較的時長是(5s)(2s),而不是2.79s和2.91s

  62. -s at比較的也是(5s)/count:2和(2s)/Count: 1
  63. 所以:-s at是
  64. Count: 1 Time=2.91s (2s) Lock=0.00s (0s) Rows=1000.0 (1000), vgos_dba[vgos_dba]@[10.130.229.196]
  65. 排在前面。
  66.  
  67.  Rows=1.0 (2) 是按照以下邏輯展示的
  68. (2)是指在Count: 2次數總共返回了2條記錄集;row=1.0顯示(2)/Count: 2,
  69. 如果此時Count是3,那麼row的計算方式是Rows=2/3,Rows=0.67
  70.  
  71. 主要功能是, 統計不同慢sql的出現次數(Count),執行最長時間(Time),累計總耗費時間(Time),等待鎖的時間(Lock),傳送給客戶端的行總數(Rows),掃描的行總數(Rows)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-1817535/,如需轉載,請註明出處,否則將追究法律責任。

相關文章