天天看點

實戰講解MySQL的expain執行計劃,面試官當場要了我(下)2 show profile3 trace分析優化器

2 show profile

SHOW PROFILE和SHOW PROFILES語句顯示概要資訊,該資訊訓示在目前會話過程中執行的語句的資源使用情況。

SHOW PROFILE和SHOW PROFILES語句已被棄用,并将在以後的MySQL版本中删除,而改用性能模式。此處我們就簡單介紹一下,大家知道有這個東西就行了。

  • 檢視是否開啟profile
  • 實戰講解MySQL的expain執行計劃,面試官當場要了我(下)2 show profile3 trace分析優化器
  • 可見,預設profiling是關閉的。

可通過set語句在session級别啟動profiling:

set profiling=1;      

可檢視執行過程中每個線程的狀态和耗時。

其中的 sendingdata 狀态表示MySQL線程開始通路資料行并把結果傳回給用戶端,而不僅僅是傳回給用戶端,由于在sending data狀态下,MySQL線程往往需要做大量的磁盤讀取操作;是以經常是整個查詢中最耗時的狀态。

支援選擇all,cpu,block io,context,switch,page faults等明細,來檢視MySQL在使用什麼資源上耗費了過高的時間,例如,選擇檢視cpu的耗費時間

show profile cpu for query 6;      

對比MyISAM的操作,同樣執行count(*)操作,檢查profile,Innodb表經曆了Sending data狀态,而MyISAM的表完全不需要通路資料

如果對MySQL 源碼感興趣,可以通過show profile source for query檢視sql解析執行過程的每個步驟對應的源碼檔案

show profile source for query 6      

3 trace分析優化器

MySQL 5.6提供。通過trace檔案能夠進一步了解優化器的選擇,更好地了解優化器的行為。

使用方式

開啟trace,設定格式為json,設定trace最大能夠使用的記憶體,避免解析過程中因為預設記憶體小而不能完整顯示

set optimizer_trace="enabled=on",end_markers_in_json=on;
set optimizer_trace_max_mem_size=1000000;      

接下來執行trace的sql語句

select * from ....where....      

最後檢查information_schema.optimizer_trace就可以知道Mysql如何執行sql

select * from information_schema.optimizer_trace      

參考