MySQL语句执行分析

作者: 张依一 | 来源:发表于2018-11-25 17:49 被阅读16次

    今天客户那边遇到一个问题:多选文件进行操作,数据量一大后台处理就特别慢,浏览器显示504超时。为了验证问题是否出在sql语句,所以用以下方法来分析:

    • 查询SQL执行记录
    • explain 分析
    • MySQL 语句执行时间

    下面会分别介绍三个方法的开启方法。

    查询SQL执行记录

    查询日志功能是否开启

    show variables LIKE 'general%';
    
    image

    general_log:日志记录功能是否开启,默认为OFF
    general_log_file:日志存放路径

    开启日志功能

    set GLOBAL general_log = 'ON'; 
    

    然后再次查询是否开启成功

    在指定路径查看SQL记录

    explain 分析

    大部分的性能分析都需要使用到该命令,可以用来查看SQL语句的执行效果,可以帮助选择更好地索引和优化语句。

    语法

    explain + SQL语句

    输出:


    image

    参数解析

    MySQL 语句执行时间

    show profile 以及show profiles语句可以显示当前会话过程中执行SQL语句的性能信息。

    查看profile是否开启

    show variables like '%profil%';
    
    image
    profiling:OFF 默认此功能关闭

    设置开启状态

    set profiling = 1;
    

    再次查看是否开启

    image
    已经是开启状态

    执行sql语句后进行分析

    执行完后,输入

    show profiles;
    

    即可查看所有的sql的执行时间

    image
    show profile for query 1 
    

    查看第1个sql语句的执行的各个操作的耗时详情。

    image
    show profile cpu, block io, memory,swaps,context switches,source for query 6;
    

    可以查看出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等

    show profile all for query 6 查看第6条语句的所有的执行信息。
    

    测试完毕后,关闭参数:

    mysql> set profiling=0
    

    慢查询

    开启慢查询,可以设置一个时间阈值,当sSQL执行时间超过阈值,则会被记录。通过这样可以定位到需要优化的SQL

    查看慢查询命令

    mysql> show variables like 'slow_query%';
    +---------------------+--------------------------------------+
    | Variable_name       | Value                                |
    +---------------------+--------------------------------------+
    | slow_query_log      | OFF                                  |
    | slow_query_log_file | /var/lib/mysql/50aacb0262cd-slow.log |
    +---------------------+--------------------------------------+
    
    mysql> show variables like 'long_query_time';
    +-----------------+-----------+
    | Variable_name   | Value     |
    +-----------------+-----------+
    | long_query_time | 10.000000 |
    +-----------------+-----------+
    

    参数说明:

    slow_query_log :是否开启慢查询
    slow_query_log_file :慢查询日志存放位置
    long_query_time:设置阈值,超过该值才会做记录

    设置步骤

    开启慢查询

    set global slow_query_log='ON';
    

    设置存放日志位置

    set global slow_query_log_file='/var/lib/mysql/slow.log ';
    

    设置超时时间

    set global long_query_time=1;
    

    日志效果

    • 首先我执行一句SQL
      mysql> select sleep(3);
      +----------+
      | sleep(3) |
      +----------+
      |        0 |
      +----------+
      1 row in set (3.00 sec)
      
    • 查看日志记录


      image

      可以查看到涉及到超过1S的SQL详情

    相关文章

      网友评论

        本文标题:MySQL语句执行分析

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