是什么
Show Profile
是mysql提供可以用來分析當(dāng)前會話中語句執(zhí)行的資源消耗情況杰扫,可以用于Sql調(diào)優(yōu)的測量。
怎么玩
- 先查看是否開啟了此功能:
show variables like 'profiling%';
默認(rèn)情況下膘掰,參數(shù)出于關(guān)閉狀態(tài)章姓,為OFF
狀態(tài) - 開啟
Profiling
:set profiling=1;
開啟此功能后,就能執(zhí)行我們的SQL語句 - 展示最近的SQL執(zhí)行情況:
show profiles;
此命令展示最近執(zhí)行的sql語句识埋,默認(rèn)是15次啤覆,一個(gè)示例如下:
Query_ID
會一直遞增,后期我們會使用這個(gè)id惭聂,來具體查詢某一條SQL的執(zhí)行耗時(shí)清單 - 具體查看某一條SQL的執(zhí)行細(xì)節(jié):
show profile cpu,block io for query 8;
如下圖為查詢id=8的這條sql的執(zhí)行細(xì)節(jié),此處查詢了cpu
和block io
這兩種類型相恃,其他可以選擇的類型在圖的下面展示:
可以使用的類型如下:
ALL辜纲;顯示所有的開銷信息
BLOCK IO:顯示塊IO相關(guān)開銷
CONTEXT SWITCHES:上下文切換相關(guān)開銷
CPU:顯示CPU相關(guān)開銷
IPC:顯示發(fā)送和接受相關(guān)開銷
MEMORY:顯示內(nèi)存相關(guān)開銷
PAGE FAULTS:顯示頁面錯(cuò)誤相關(guān)開銷
SOURCE:顯示和Source_function, Source_file,Source_line相關(guān)的相關(guān)開銷
SWAPS:顯示交換次數(shù)相關(guān)開銷
應(yīng)該重點(diǎn)關(guān)注什么
請讀者繼續(xù)看前面的圖SQL執(zhí)行具體細(xì)節(jié)
,左邊Status
列展示了一條SQL執(zhí)行的從開始到清理的整個(gè)生命周期中執(zhí)行的操作。如果在其生命周期階段出現(xiàn)如下的情況的就要重視了:
- converting HEAP to MyISAM :查詢結(jié)果太大耕腾,內(nèi)存都不夠用了往磁盤上面搬了
- Creating tmp table :創(chuàng)建了臨時(shí)表见剩,先拷貝到臨時(shí)表,用完后再刪除
- Copying to tmp table on disk:把內(nèi)存中的臨時(shí)表復(fù)制到磁盤中扫俺,這個(gè)很耗性能
- locked :這個(gè)就是指在等待鎖的意思
可以看看如下Creating tmp table
的樣例
總結(jié)
開啟Profiling
后苍苞,mysql會留下15條最近執(zhí)行的sql的現(xiàn)場, 便于我們發(fā)現(xiàn)問題。
Show profiles
用來查最近的15條狼纬。
Show profile
用來展示每一個(gè)SQL執(zhí)行階段的耗時(shí)清單羹呵,便于我們發(fā)現(xiàn)耗時(shí)最多的地方,然后以此為依據(jù)查找問題所在疗琉,最后優(yōu)化SQL或者優(yōu)化mysql參數(shù)冈欢。比如耗時(shí)清單創(chuàng)建了臨時(shí)表,就要考慮表是否創(chuàng)建索引盈简,如果創(chuàng)建了那么是否沒有用到或者失效了凑耻。
總的來說Profiling
是一個(gè)很不錯(cuò)的mysql性能分析工具。