MySQL中show profile的使用與分析

一渔彰、開啟show profile功能

  1. 查看當(dāng)前的狀態(tài)
    是否啟用缩焦,看看當(dāng)前的MySQL版本是否支持
    show variables like 'profiling';
    
    默認(rèn)是關(guān)閉锯厢,使用前需要開啟
    或者
    show variables like 'profiling%';
    
    示例:
    mysql> show variables like 'profiling';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | profiling     | OFF   |
    +---------------+-------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> show variables like 'profiling%';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | profiling              | OFF   |
    | profiling_history_size | 15    |
    +------------------------+-------+
    2 rows in set, 1 warning (0.00 sec)
    
  2. 開啟
    默認(rèn)該功能是關(guān)閉的苹威,使用前需要開啟
    set profiling=on;
    
    示例:
    mysql> set profiling=on;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> show variables like 'profiling%';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | profiling              | ON    |
    | profiling_history_size | 15    |
    +------------------------+-------+
    2 rows in set, 1 warning (0.00 sec)
    
    目前只是臨時設(shè)置腕铸,退出當(dāng)前連接之后,設(shè)置失效躬厌。這種很耗性能的操作马昨,沒有必要一直開啟。

二扛施、運(yùn)行SQL并查看結(jié)果

  1. 運(yùn)行SQL語句
    運(yùn)行需要測試SQL語句鸿捧,比如這里我運(yùn)行的SQL語句如下:
    select item_title from tb_orders group by item_title;
    select sleep(3);
    select * from tb_orders where id=1;
    
  2. 查看結(jié)果
    mysql> show profiles;
    +----------+------------+------------------------------------------------------+
    | Query_ID | Duration   | Query                                                |
    +----------+------------+------------------------------------------------------+
    |        1 | 0.00151275 | select item_title from tb_orders group by item_title |
    |        2 | 3.00110125 | select sleep(3)                                      |
    |        3 | 0.00091525 | select * from tb_orders where id=1                   |
    +----------+------------+------------------------------------------------------+
    3 rows in set, 1 warning (0.00 sec)
    
    這里的記錄了所有sql的執(zhí)行記錄的信息。Duration是該條SQL的運(yùn)行時間疙渣〕着可以根據(jù)這個值來分辨哪個SQL比較耗時。

三昌阿、診斷SQL

在上面的粗略結(jié)果展示出來之后饥脑,我們能看出哪條SQL比較耗時。如果我們想知道耗時具體耗在哪里的話懦冰,可以使用SQL診斷獲取更多更詳細(xì)的信息灶轰。
我們以Query ID為1的那條語句為例。語法如下:

show profile [選項] for query [上一步前面的問題SQL數(shù)字號碼];

示例:

mysql> show profile for query 1;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000073 |
| Executing hook on transaction  | 0.000003 |
| starting                       | 0.000004 |
| checking permissions           | 0.000004 |
| Opening tables                 | 0.000146 |
| init                           | 0.000004 |
| System lock                    | 0.000005 |
| optimizing                     | 0.000003 |
| statistics                     | 0.000009 |
| preparing                      | 0.000010 |
| Creating tmp table             | 0.000022 |
| executing                      | 0.000002 |
| Sending data                   | 0.001181 |
| end                            | 0.000003 |
| query end                      | 0.000001 |
| waiting for handler commit     | 0.000005 |
| removing tmp table             | 0.000004 |
| waiting for handler commit     | 0.000002 |
| closing tables                 | 0.000005 |
| freeing items                  | 0.000022 |
| cleaning up                    | 0.000008 |
+--------------------------------+----------+
21 rows in set, 1 warning (0.00 sec)

這里列舉了數(shù)據(jù)庫處理你的SQL語句詳細(xì)步驟刷钢,包括每一步驟的耗時笋颤。可以參照這些數(shù)據(jù)對比分析自己的SQL的問題具體出在哪里内地。
分析的時候伴澄,CUP消耗和阻塞IO也是很重要的參考標(biāo)準(zhǔn),可以增加參數(shù)以展示數(shù)據(jù)阱缓,示例如下:

mysql> show profile cpu, block io for query 1;
+--------------------------------+----------+----------+------------+--------------+---------------+
| Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+--------------------------------+----------+----------+------------+--------------+---------------+
| starting                       | 0.000073 | 0.000000 |   0.000000 |         NULL |          NULL |
| Executing hook on transaction  | 0.000003 | 0.000000 |   0.000000 |         NULL |          NULL |
| starting                       | 0.000004 | 0.000000 |   0.000000 |         NULL |          NULL |
| checking permissions           | 0.000004 | 0.000000 |   0.000000 |         NULL |          NULL |
| Opening tables                 | 0.000146 | 0.000000 |   0.000000 |         NULL |          NULL |
| init                           | 0.000004 | 0.000000 |   0.000000 |         NULL |          NULL |
| System lock                    | 0.000005 | 0.000000 |   0.000000 |         NULL |          NULL |
| optimizing                     | 0.000003 | 0.000000 |   0.000000 |         NULL |          NULL |
| statistics                     | 0.000009 | 0.000000 |   0.000000 |         NULL |          NULL |
| preparing                      | 0.000010 | 0.000000 |   0.000000 |         NULL |          NULL |
| Creating tmp table             | 0.000022 | 0.000000 |   0.000000 |         NULL |          NULL |
| executing                      | 0.000002 | 0.000000 |   0.000000 |         NULL |          NULL |
| Sending data                   | 0.001181 | 0.000000 |   0.000000 |         NULL |          NULL |
| end                            | 0.000003 | 0.000000 |   0.000000 |         NULL |          NULL |
| query end                      | 0.000001 | 0.000000 |   0.000000 |         NULL |          NULL |
| waiting for handler commit     | 0.000005 | 0.000000 |   0.000000 |         NULL |          NULL |
| removing tmp table             | 0.000004 | 0.000000 |   0.000000 |         NULL |          NULL |
| waiting for handler commit     | 0.000002 | 0.000000 |   0.000000 |         NULL |          NULL |
| closing tables                 | 0.000005 | 0.000000 |   0.000000 |         NULL |          NULL |
| freeing items                  | 0.000022 | 0.000000 |   0.000000 |         NULL |          NULL |
| cleaning up                    | 0.000008 | 0.000000 |   0.000000 |         NULL |          NULL |
+--------------------------------+----------+----------+------------+--------------+---------------+
21 rows in set, 1 warning (0.00 sec)

參數(shù)備注:

type 說明
ALL 顯示所有的開銷信息
BLOCKIO 顯示塊℃相關(guān)開銷
CONTEXTSWITCHES 上下文切換相關(guān)開銷
CPU 顯示CPU相關(guān)開銷信息
IPC 顯示發(fā)送和接收相關(guān)開銷信息
MEMORY 顯示內(nèi)存相關(guān)開銷信息
PAGE FAULTS 顯示頁面錯誤相關(guān)開銷信息
SOURCE 顯示和Sourcefunction非凌,Source蒯e,Source ine相關(guān)的開銷信息
SWAPS 顯示交換次數(shù)相關(guān)開銷的信息

四荆针、開發(fā)需要注意的事項

  1. converting HEAP to MyISAM:查詢結(jié)果太大敞嗡,內(nèi)存都不夠用了往磁盤上搬了。
  2. Creating tmp table
    創(chuàng)建臨時表
    拷貝數(shù)據(jù)到臨時表
    用完再刪除
  3. Copying to tmp table on disk:把內(nèi)存中臨時表復(fù)制到磁盤航背,危險:磴病!玖媚!
  4. locked
    出現(xiàn)以上情況的時候箕肃,表示你的SQL很耗性能,必須要優(yōu)化處理了今魔。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勺像,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子错森,更是在濱河造成了極大的恐慌咏删,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件问词,死亡現(xiàn)場離奇詭異督函,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)激挪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門辰狡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垄分,你說我怎么就攤上這事宛篇。” “怎么了薄湿?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵叫倍,是天一觀的道長偷卧。 經(jīng)常有香客問我,道長吆倦,這世上最難降的妖魔是什么听诸? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蚕泽,結(jié)果婚禮上晌梨,老公的妹妹穿的比我還像新娘。我一直安慰自己须妻,他們只是感情好仔蝌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荒吏,像睡著了一般敛惊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绰更,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天豆混,我揣著相機(jī)與錄音,去河邊找鬼动知。 笑死皿伺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盒粮。 我是一名探鬼主播鸵鸥,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丹皱!你這毒婦竟也來了妒穴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤摊崭,失蹤者是張志新(化名)和其女友劉穎讼油,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呢簸,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矮台,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了根时。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘦赫。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛤迎,靈堂內(nèi)的尸體忽然破棺而出确虱,到底是詐尸還是另有隱情,我是刑警寧澤替裆,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布校辩,位于F島的核電站窘问,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宜咒。R本人自食惡果不足惜惠赫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荧呐。 院中可真熱鬧,春花似錦纸镊、人聲如沸倍阐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峰搪。三九已至,卻和暖如春凯旭,著一層夾襖步出監(jiān)牢的瞬間概耻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工罐呼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞠柄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓嫉柴,卻偏偏與公主長得像厌杜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子计螺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348