• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Mysql开启慢SQL并分析原因
    POST TIME:2021-10-18 20:35

    第一步.开启mysql慢查询

    方式一:修改配置文件

    Windows:Windows 的配置文件为 my.ini,一般在 MySQL 的安装目录下或者 c:\Windows 下。

    Linux:Linux 的配置文件为 my.cnf ,一般在 /etc 下

    在 my.ini 增加几行:

    [mysqlld] 
    long_query_time=2 
    #5.0、5.1等版本配置如下选项 
    log-slow-queries="mysql_slow_query.log" 
    #5.5及以上版本配置如下选项 
    slow-query-log=On 
    slow_query_log_file="mysql_slow_query.log" 
    log-query-not-using-indexes 

    第一句使用来定义查过多少秒的查询算是慢查询,我这里定义的是2秒

    第二句使用来定义慢查询日志的路径(因为是windows,所以不牵涉权限问题)

    第三句就是记录下没有使用索引的query

    第二步:查看关于慢查询的状态

    方式二:通过MySQL数据库开启慢查询

    上文的配置需要重启mysql server进程mysqld才会生效。但是很多时候,尤其是产品运营环境,不希望每次修改都需要重新启动mysql服务器,也希望能在某些特定时间记 录。MySQL5.1给我们提供了更为灵活的运行时控制,使得你不必重新启动mysql服务器,也能选择性地记录或者不记录某些slow queries。

    MySQL5.1中,提供了全局变量slow_query_logslow_query_log_file可以灵活地控制enable/disable慢查询。同时可以通过long_query_time设置时间

    #//启用slow query记录
    #注意:设置了slow_query_log全局变量, log_slow_queries也会隐性地跟着改变
    mysql>set global slow_query_log=ON

    不幸运的是,在MySQL5.0并没有提供类似的全局变量来灵活控制,但是我们可以通过将long_query_time设置得足够大来避免记录某些查询语句。比如

    mysql>set global long_query_time = 3600;
    
    mysql>set global log_querise_not_using_indexes = ON;

    MySQL5.0, 不关服务的情况下,希望不记录日志的办法是将日志文件成为/dev/null的符号链接(symbolic link)。注意:你只需要在改变后运行FLUSH LOGS以确定MYSQL释放当前的日志文件描述符,重新把日志记录到/dev/null

    和MySQL5.0不同,MySQL5.1可以在运行时改变日记行为,将日志记录到数据库表中。只要将mysql全局变量log_output设置为 TABLE即可。MySQL会将日志分别记录到表mysql.gengera_log和mysql.slow_log二张表中。但是,我们推荐将日志记录 在日记文件中。

    mysql> show variables like ‘log_output'\G
    Variable_name: log_output
    Value: FILE
    mysql>set global log_output='table';

    缺陷与审记

    虽然记录了slow query能够帮助你优化产品。但是MySQL目前版本,还有几大蹩足的地方。

    通过microslow-patch补丁可使用更细的时间粒度,和记录所有执行过的sql语句。不过,使用这个补订不得不自己编译MySQL,出于稳定性考滤,我们推荐在开发测试环境,可以打上这个补丁,享受这个补丁带来的便利。在运营环境尽量不要这么做…

    第二步.验证慢查询是否开启

    执行如下SQL语句来查看mysql慢查询的状态

    执行结果会把是否开启慢查询、慢查询的秒数、慢查询日志等信息打印在屏幕上。

    /*查看慢查询时间 */ 
    show variables like "long_query_time";默认10s 
    /*查看慢查询配置情况 */ 
    show status like "%slow_queries%"; 
    /*查看慢查询日志路径 */ 
     show variables like "%slow%"; 

    第三步:执行一次慢查询操作

    其实想要执行一次有实际意义的慢查询比较困难,因为在自己测试的时候,就算查询有20万条数据的海量表,也只需要0.几秒。我们可以通过如下语句代替:

    SELECT SLEEP(10);

    第四步:查看慢查询的数量

    通过如下sql语句,来查看一共执行过几次慢查询:

    show global status like '%slow%';

    mysql日志的配置:

    注意:这些日文件在mysql重启的时候才会生成 
    #记录所有sql语句 
    log=E:/mysqllog/mysql.log 
    #记录数据库启动关闭信息,以及运行过程中产生的错误信息 
    log-error=E:/mysqllog/myerror.log 
    # 记录除select语句之外的所有sql语句到日志中,可以用来恢复数据文件 
    log-bin=E:/mysqllog/bin 
    #记录查询慢的sql语句 
    log-slow-queries=E:/mysqllog/slow.log  
    #慢查询时间 
    long_query_time=2 

    第四步:分析慢查询日志

    方式一:通过工具分析

    MySQL自带了mysqldumpslow工具用来分析slow query日志,除此之外,还有一些好用的开源工具。比如MyProfi(下载地址:http://sourceforge.net/projects/myprofi/)、mysql-log-filter,当然还有mysqlsla

    以下是mysqldumpslow常用参数说明,详细的可应用mysqldumpslow -help查询。

    接下来就是用mysql自带的慢查询工具mysqldumpslow分析了(mysql的bin目录下),我这里的日志文件名字是host-slow.log。

    列出记录次数最多的10个sql语句

    mysqldumpslow -s c -t 10 host-slow.log

    列出返回记录集最多的10个sql语句

    mysqldumpslow -s r -t 10 host-slow.log

    按照时间返回前10条里面含有左连接的sql语句

    mysqldumpslow -s t -t 10 -g "left join" host-slow.log

    使用mysqldumpslow命令可以非常明确的得到各种我们需要的查询语句,对MySQL查询语句的监控、分析、优化起到非常大的帮助。

    方式二:直接分析mysql慢查询日志

    日志部分内容如下:

    # Time: 121017 17:38:54 
    # User@Host: root[root] @ localhost [127.0.0.1] 
    # Query_time: 3.794217 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 4194304 
    SET timestamp=1350466734; 
    select * from wei where text='orange'; 
    # Time: 121017 17:46:22 
    # User@Host: root[root] @ localhost [127.0.0.1] 
    # Query_time: 3.819219 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 4194304 
    SET timestamp=1350467182; 
    select * from wei where text='xishizhaohua'; 

    其实定位到了慢查询语句就已经完成了一大不了,执行explain或者desc命令查看慢查询语句,如下图:

    问题很明显,解决方式也很明显,建索引了。

    mysql> create index text_index on wei(text);  
    Query OK, 4194304 rows affected (1 min 58.07 sec)  
    Records: 4194304 Duplicates: 0 Warnings: 0 

    然后在执行查询操作,用时明显少了很多。

    mysql> select * from wei where text='orange'; 
    +---------+--------+ 
    | id   | text  | 
    +---------+--------+ 
    | 4103519 | orange | 
    +---------+--------+ 
    1 row in set (0.33 sec) 

    Slow Query日志,虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的,意义可能没有你想象的那么大。它只告诉了你哪些语句慢,但是为什么慢?具体 原因,还是需要你自己去分析,不断的调试。也许,你只需要换一条更有效的sql语句,也许你只需简单地增加一个索引,但也有可能你需要调整你应用程序的设 计方案。比如,上面那条语句是很明显,它检查了600多万行数据。不幸的是,并不是每条语句都这么明显。也许还有别的原因,比如:

    所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow query需要特别注意。如果个别出现,则做一些常规检查即可。我们建议,统计并且形成基准报告,进行比较排除,比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

    您可能感兴趣的文章:
    • MySQL的一条慢SQL查询导致整个网站宕机的解决方法
    • MySQL利用profile分析慢sql详解(group left join效率高于子查询)
    • MySQL慢SQL语句常见诱因以及解决方法
    • 详细聊聊MySQL中慢SQL优化的方向
    上一篇:干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)
    下一篇:MySQL字符集乱码及解决方案分享
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信