只需三步!慢日誌去無蹤

2022-07-11 03:21:17 字數 2635 閱讀 2575

| 作者

第一步:explain

最先登場的毫無疑問就是 explain 語句了,用過 mysql 的人應該都知道這個檢視 sql 語句執行計畫的命令,詳細的資料在網上有很多,這裡就略過了。一般來說,95% 的慢查詢問題只需要 explain 就可以解決了。手工執行的時候,在 extra 列裡面,避免出現use temporary table和using file sort這類關鍵字,type 列中也盡量避免 all 型別(全表掃瞄)出現。

第二步:profile

既然 explain 能看到 sql 的執行計畫,能判斷出來有沒有好好利用索引,dbbrain 也能給出索引的優化建議,那麼慢查詢的分析為什麼還會有三步曲?

原因很簡單,mysql 慢查詢,並不一定慢在有沒有索引;sql 的執行環節中任意一環出了問題都會表現為查詢變慢,所以用了索引,explain 的結果也很完美,但是還是慢,怎麼辦?

這時候,就需要 profile 來幫忙了,這個命令可以詳細的列出 sql 語句在每乙個步驟消耗的時間,前提(缺點)是先執行一遍語句。

profile 預設是關閉的,所以需要在 client 端先開啟,操作如下:

set session profiling = 1;

在實際的生產環境中,可能會需要加大profile的佇列,保證想要檢視的 profile 結果還儲存著,因此可以用如下操作來增加 profile 的佇列大小

set session profiling_history_size = 50;

到這一步,profile 的功能就開啟了,這裡先刪除索引,簡單試一下 sql 語句,explain 一下看看輸出

type 列是 all,顯然這種語句是不合格的,「假設」索引「覺得」沒問題,但是這個語句還是比預想的要慢,那麼可以看看這條語句各個階段的耗時,先執行一次 select,然後再檢視 profile 的結果:

可以看到 id 為 11 的那一行就是執行過的語句,這時候使用show profile block io,cpu,memory,source for query 11;來檢視統計資訊:

sending data 並不只是在伺服器端和客戶端之間 sending data,還包括了從磁碟讀取資料的時間,因為這個查詢執行了全表掃瞄,所以這個時間會比較高,當然索引的效率不高也會導致這部分時間比較久。

如果還有 order by 的話,這裡面也會出現 sort 相關的資訊。

經過了這兩部曲之後,基本上乙個 sql 為什麼慢,慢在**基本上可以定位出來了,那麼最後的手段主要是解決什麼問題呢?

第三步:optimizer_trace

optimizer_trace 是 mysql 5.6 新增的新功能,顧名思義,這個功能可以看到內部查詢計畫的 trace 資訊,從而可以知道 mysql 是如何在眾多索引中選中最「棒」的那個。一般來說,這個最「棒」的索引選錯了,就需要根據 optimizer_trace 的資訊來判斷為什麼會選錯,是 mysql 的配置原因,還是 sql 某些地方寫的不好導致 mysql 誤判了。

開啟這個功能的方式如下:

set session optimizer_trace='enabled=on';

隨便執行乙個 explain 語句,生成乙個執行計畫,然後在information_chema.optimizer_trace的表裡面查詢這一條語句對應的資訊:

內容是非常長的 json 格式,所以推薦把結果轉存到其他地方,然後用 json 的轉換工具來輔助檢視,如果要看索引的選擇情況,就重點關注這個 json 的ref_optimizer_key_uses,rows_estimation 及之後的部分,這裡會展示索引選擇相關的資訊,擷取一部分結果作為示例:

在這裡面能看到詳細的統計資訊,包括 cost,預計的 rows,在之後的內容中也會顯示最終選擇的索引:

通常來說,cost 數值越低,代表這個執行計畫的執行速度越快。

總結

總而言之,通過這三步曲的排查,基本上 sql 的問題就都能找出來了,好好掌握這些基本技能對於 dba 來說還是很有用的。

本文由部落格一文多發平台 openwrite 發布!

單點登入只需三步

操作檢測 public function check login type 1 this load m admin admin uid this getgpc admin s t ok en token t oken this getcookie admin login token var dump...

三步實現 AngularJS URL 去 號

1 開啟原始碼,設定 locationprovider 模組,將html5mode設定為true.推薦閱讀 angularjs 官方 location文件 2 在 index.html 入口檔案中設定 標籤定義相對路徑 index 在根目錄下的位址 html5mode設定為true就會自動的解析相對...

vue入門之環境搭建只需三步

我們一般用npm命令列安裝vue,所以第一步安裝node.js,如果已安裝就可以忽略此步驟 node.js node.js 安裝node.js一路next即可。在命令列中輸入vue npminstall global 注意 此處是全域性安裝 在命令列中輸入vue npminstall g vue c...