MySQL show profile

1. 是什麼?

是MySQL提供的可以用來分析當前會話中語句執行的資源消耗情況的工具,可以用於sql調優的測量。默認是處於關閉狀態的,會保存最近15次的運行結果。

2. 查看狀態:

執行如下命令即可查看profile的狀態:

show variables like 'profiling';

可以看到,現在是關閉的。

3. 開啓功能:

可以執行如下語句將其開啓:

set profiling = 'on';

4. 運行sql:

因爲上面我們已經開啓了profile,所以執行的sql都會被記錄到相關文件中,下面我們隨便執行幾段sql。

select * from emp;
select * from dept;
select * from emp group by id%10 limit 150000;
# order by 5表示按照第五個字段排序
select * from emp group by id%20 order by 5;

5. show profile:

執行了sql之後,來查看show profile的結果:

show profiles;

查出來可以看到,執行過的sql這裏都有記錄,前面有對應的id。然後我們可以根據id,查出該條sql執行時的cpu、io等情況,比如我要查看id爲14的這條sql執行情況,那麼就執行:

show profile cpu, block io for query 14;

可以看到,查出來的結果就涵蓋了sql執行過程中的整個生命週期,從校驗權限、打開表開始,一直到查詢結束,cleaning up。每個過程的cpu和io情況都對應的展示出來了。上面我們查詢的字段是cpu和block io,那還有其他的嗎?當然有,如下表:

column description
all 所有的開銷信息
block io 塊io相關開銷信息
context switches 上下文切換相關開銷信息
cpu cpu相關開銷信息
ipc 發送和接收相關開銷信息
memory 內存相關開銷信息
page faults 頁面錯誤相關開銷信息
source source_function,source_file,source_line相關開銷信息
swaps 交換次數相關開銷信息

查出來之後,我們要怎麼知道生命週期中的哪個步驟有貓病呢?主要觀察如下四個:

  • converting heap to MyISAM是查詢出來的結果集太大,內存不夠用
  • creating temp table是創建了臨時表,也非常耗時
  • copying to temp table on disk是把內存中的臨時表複製到了磁盤中,特別耗時
  • locked是表被鎖了

如果查出來的status列包含了上述四個中的一個,都是會拖慢sql的執行速度的。

6. 全局查詢日誌:

這個主要是用於開發、測試環境用來排查問題的,永遠不要中在生產環境中開啓此功能,因爲日誌會非常非常多。

啓用方式有兩種:

  • 修改my.cnf,添加如下配置:
# 開啓
general_log=1
# 日誌文件路徑
general_log_file=/path/logfile
# 輸出格式
log_output=FILE
  • 用sql語句開啓:
set global general_log=1;
set global log_output='TABLE';

執行完之後,此後所執行的sql都會保存到mysql庫的general_log表裏。

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