美文网首页
MySQL show profile

MySQL show profile

作者: 贪挽懒月 | 来源:发表于2021-05-26 14:52 被阅读0次

    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表里。

    相关文章

      网友评论

          本文标题:MySQL show profile

          本文链接:https://www.haomeiwen.com/subject/ttzncltx.html