关键词搜索

源码搜索 ×
×

MySQL基础:参数调优:6:使用慢查询定位性能瓶颈

发布2019-03-21浏览807次

详情内容

MySQL提供了慢查询可以快速定位性能瓶颈,这篇文章通过具体的示例来介绍一下如何设定方法。

基础知识

慢查询是MySQL的一种基本日志,详细信息可参看。

使用示例

接下来在一个具体的调优示例中展示一下如何使用慢查询

确认慢查询状态

可以看到缺省状态下,慢查询是关闭的状态。

mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
1 row in set (0.01 sec)

mysql> 

    打开慢查询

    通过执行set global slow_query_log=1则打开了慢查询日志

    mysql> set global slow_query_log=1;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show variables like 'slow_query_log';
    +----------------+-------+
    | Variable_name  | Value |
    +----------------+-------+
    | slow_query_log | ON    |
    +----------------+-------+
    1 row in set (0.01 sec)
    
    mysql> 
    
      10
    • 11
    • 12

    而查询日志的详细信息保存在slow_query_log_file所设定的文件里

    mysql> show variables like 'slow_query_log_file';
    +---------------------+--------------------------------------+
    | Variable_name       | Value                                |
    +---------------------+--------------------------------------+
    | slow_query_log_file | /var/lib/mysql/6436efce6f31-slow.log |
    +---------------------+--------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

      此文件缺省状况下会放到mysql数据目录下,名称为hostname-slow.log,由于本文示例的mysql在容器中运行,所以显示的日志名称为6436efce6f31-slow.log,此时刚刚打开,可以确认已经生成了如下内容:

      # cat /var/lib/mysql/6436efce6f31-slow.log
      mysqld, Version: 5.7.16 (MySQL Community Server (GPL)). started with:
      Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
      Time                 Id Command    Argument
      # 
      
      • 1
      • 2
      • 3
      • 4
      • 5

      设定阈值

      从生成的慢查询日志并未看到有用的信息,慢查询的定义,多慢算慢,则是通过long_query_time来确认的,该值的单位为秒。

      mysql> show variables like 'long_query_time';
      +-----------------+-----------+
      | Variable_name   | Value     |
      +-----------------+-----------+
      | long_query_time | 10.000000 |
      +-----------------+-----------+
      1 row in set (0.01 sec)
      
      mysql> 
      

        由于缺省值设定为10秒,对于数据库操作超过10秒的非常之少,所以没有看到有用的信息,接下来我们将此值设定为200毫秒,即0.2

        mysql> set global long_query_time=0.2;
        Query OK, 0 rows affected (0.00 sec)
        
        mysql>
        
        • 1
        • 2
        • 3
        • 4

        退出当前的mysql终端,重新进入并确认,发现已经生效

        mysql> show variables like 'long_query_time';
        +-----------------+----------+
        | Variable_name   | Value    |
        +-----------------+----------+
        | long_query_time | 0.200000 |
        +-----------------+----------+
        1 row in set (0.00 sec)
        
        mysql> 
        

          设定建议

          • 修改配置文件

          为了能够持久化的保持,而不至于重启或者容器重新生成后恢复默认状态,需要设定到配置文件中。

          • 官方的mysql镜像配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf
          • 建议设定示例(数据库操作超过100毫秒认为是慢查询,可根据需要进行设定,如果过多,可逐步设定,比如先行设定为2秒,逐渐降低来确认瓶颈所在)
          # slow query setting
          slow_query_log=1
          long_query_time=0.1
          
          • 1
          • 2
          • 3

          相关技术文章

          点击QQ咨询
          开通会员
          返回顶部
          ×
          微信扫码支付
          微信扫码支付
          确定支付下载
          请使用微信描二维码支付
          ×

          提示信息

          ×

          选择支付方式

          • 微信支付
          • 支付宝付款
          确定支付下载