1. 是什么?
是MySQL提供的可以用來分析當前會話中語句執(zhí)行的資源消耗情況的工具,可以用于sql調優(yōu)的測量。默認是處于關閉狀態(tài)的,會保存最近15次的運行結果。
2. 查看狀態(tài):
執(zhí)行如下命令即可查看profile的狀態(tài):
show variables like 'profiling';

可以看到,現(xiàn)在是關閉的。
3. 開啟功能:
可以執(zhí)行如下語句將其開啟:
set profiling = 'on';
4. 運行sql:
因為上面我們已經開啟了profile,所以執(zhí)行的sql都會被記錄到相關文件中,下面我們隨便執(zhí)行幾段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:
執(zhí)行了sql之后,來查看show profile的結果:
show profiles;

查出來可以看到,執(zhí)行過的sql這里都有記錄,前面有對應的id。然后我們可以根據(jù)id,查出該條sql執(zhí)行時的cpu、io等情況,比如我要查看id為14的這條sql執(zhí)行情況,那么就執(zhí)行:
show profile cpu, block io for query 14;

可以看到,查出來的結果就涵蓋了sql執(zhí)行過程中的整個生命周期,從校驗權限、打開表開始,一直到查詢結束,cleaning up。每個過程的cpu和io情況都對應的展示出來了。上面我們查詢的字段是cpu和block io,那還有其他的嗎?當然有,如下表:
| column | description |
|---|---|
| all | 所有的開銷信息 |
| block io | 塊io相關開銷信息 |
| context switches | 上下文切換相關開銷信息 |
| cpu | cpu相關開銷信息 |
| ipc | 發(fā)送和接收相關開銷信息 |
| memory | 內存相關開銷信息 |
| page faults | 頁面錯誤相關開銷信息 |
| source | source_function,source_file,source_line相關開銷信息 |
| swaps | 交換次數(shù)相關開銷信息 |
查出來之后,我們要怎么知道生命周期中的哪個步驟有貓病呢?主要觀察如下四個:
- converting heap to MyISAM是查詢出來的結果集太大,內存不夠用
- creating temp table是創(chuàng)建了臨時表,也非常耗時
- copying to temp table on disk是把內存中的臨時表復制到了磁盤中,特別耗時
- locked是表被鎖了
如果查出來的status列包含了上述四個中的一個,都是會拖慢sql的執(zhí)行速度的。
6. 全局查詢日志:
這個主要是用于開發(fā)、測試環(huán)境用來排查問題的,永遠不要中在生產環(huán)境中開啟此功能,因為日志會非常非常多。
啟用方式有兩種:
- 修改
my.cnf,添加如下配置:
# 開啟
general_log=1
# 日志文件路徑
general_log_file=/path/logfile
# 輸出格式
log_output=FILE
- 用sql語句開啟:
set global general_log=1;
set global log_output='TABLE';
執(zhí)行完之后,此后所執(zhí)行的sql都會保存到mysql庫的general_log表里。