MySQL中show profile的使用与分析

一、开启show profile功能

  1. 查看当前的状态
    是否启用,看看当前的MySQL版本是否支持
    show variables like 'profiling';
    
    默认是关闭,使用前需要开启
    或者
    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. 开启
    默认该功能是关闭的,使用前需要开启
    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)
    
    目前只是临时设置,退出当前连接之后,设置失效。这种很耗性能的操作,没有必要一直开启。

二、运行SQL并查看结果

  1. 运行SQL语句
    运行需要测试SQL语句,比如这里我运行的SQL语句如下:
    select item_title from tb_orders group by item_title;
    select sleep(3);
    select * from tb_orders where id=1;
    
  2. 查看结果
    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的执行记录的信息。Duration是该条SQL的运行时间。可以根据这个值来分辨哪个SQL比较耗时。

三、诊断SQL

在上面的粗略结果展示出来之后,我们能看出哪条SQL比较耗时。如果我们想知道耗时具体耗在哪里的话,可以使用SQL诊断获取更多更详细的信息。
我们以Query ID为1的那条语句为例。语法如下:

show profile [选项] for query [上一步前面的问题SQL数字号码];

示例:

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)

这里列举了数据库处理你的SQL语句详细步骤,包括每一步骤的耗时。可以参照这些数据对比分析自己的SQL的问题具体出在哪里。
分析的时候,CUP消耗和阻塞IO也是很重要的参考标准,可以增加参数以展示数据,示例如下:

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)

参数备注:

type 说明
ALL 显示所有的开销信息
BLOCKIO 显示块℃相关开销
CONTEXTSWITCHES 上下文切换相关开销
CPU 显示CPU相关开销信息
IPC 显示发送和接收相关开销信息
MEMORY 显示内存相关开销信息
PAGE FAULTS 显示页面错误相关开销信息
SOURCE 显示和Sourcefunction,Source蒯e,Source ine相关的开销信息
SWAPS 显示交换次数相关开销的信息

四、开发需要注意的事项

  1. converting HEAP to MyISAM:查询结果太大,内存都不够用了往磁盘上搬了。
  2. Creating tmp table
    创建临时表
    拷贝数据到临时表
    用完再删除
  3. Copying to tmp table on disk:把内存中临时表复制到磁盘,危险!!!
  4. locked
    出现以上情况的时候,表示你的SQL很耗性能,必须要优化处理了。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348