• [存]数据库慢sql测试规范


    数据库慢sql测试规范

    一、相关数据库信息

    二、sql bug登记

    测试过程中,输入如下命令查看慢sql日志:

    tail -200f /mysqlLog/logs/mysql.slow   ----实时打印200条日志

    目前一般设置的超过1s则记录到慢sql日志,可以根据实际情况进行调整,见目录三

    我们在平常测试过程中,如果遇到查询比较慢的情况就可以试着对这个进行监控,查看日志来分析,是否是由于慢查询导致的原因。

    Ps:功能测试中,查询时间超过1s的,如非特殊情况,需登记bug

    三、配置参考

    1)开启慢查询  

    使用navicat连接需要操作的数据库

    mysql> show variables like "%long%";      //查看一下默认为慢查询的时间10秒  

    +-----------------+-----------+  

    | Variable_name   | Value     |  

    +-----------------+-----------+  

    | long_query_time | 10.000000 |  

    +-----------------+-----------+  

    1 row in set (0.00 sec)  

      

    mysql> set global long_query_time=2;     //设置成2秒,加上global,下次进mysql已然生效  

    Query OK, 0 rows affected (0.00 sec)  

      

    mysql> show variables like "%slow%";          //查看一下慢查询是不是已经开启  

    +---------------------+---------------------------------+  

    | Variable_name       | Value                           |  

    +---------------------+---------------------------------+  

    | log_slow_queries    | OFF                             |  

    | slow_launch_time    | 2                               |  

    | slow_query_log      | OFF                             |  

    | slow_query_log_file | /usr/local/mysql/mysql-slow.log |  

    +---------------------+---------------------------------+  

    4 rows in set (0.00 sec)  

      

    mysql> set slow_query_log='ON';                        //加上global,不然会报错的。  

    ERROR 1229 (HY000): Variable 'slow_query_log' is a GLOBAL variable and should be set with SET GLOBAL  

    mysql> set global slow_query_log='ON';            //启用慢查询  

    Query OK, 0 rows affected (0.28 sec)  

      

    mysql> show variables like "%slow%";              //查看是否已经开启  

    +---------------------+---------------------------------+  

    | Variable_name       | Value                           |  

    +---------------------+---------------------------------+  

    | log_slow_queries    | ON                              |  

    | slow_launch_time    | 2                               |  

    | slow_query_log      | ON                              |  

    | slow_query_log_file | /usr/local/mysql/mysql-slow.log |  

    +---------------------+---------------------------------+  

    4 rows in set (0.00 sec)

    set  global general_log='ON';  //开启执行sql日志
    
    show variables like "%log%";  //查看日志是否开启

    2)验证慢查询是否开启

    /*查看慢查询时间 */  

    show variables like "long_query_time";默认2s  

      

    /*查看慢查询配置情况 */  

    show status like "%slow_queries%";  

      

    /*查看慢查询日志路径 */  

     show variables like "%slow%";

    3)分析慢查询日志

    直接分析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多万行数据。不幸的是,并不是每条语句都这么明显。也许还有别的原因,比如:

    *锁表了,导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间

    *数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优

    *备份数据库,I/O变慢

    *也许同时运行了其它的查询,减少了当前查询

    所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow query需要特别注意。如果个别出现,则做一些常规检查即可。

  • 相关阅读:
    What is the difference between Serialization and Marshaling?
    IEEE Standard 754 for Binary Floating-Point Arithmetic
    没有单元测试,就很难有真正的积累。
    一般只用 20% 的代码就可以解决 80% 的问题。但要想解决剩下 20% 的问题的话,则需要额外 80% 的代码。
    为失败设计,大量引入对SRE的理解,鲁棒性高
    用git合并分支时,如何保持某些文件不被合并
    git 分支合并时如何忽略某个文件
    Golang拼接字符串的5种方法及其效率_Chrispink-CSDN博客_golang 字符串拼接效率 https://blog.csdn.net/m0_37422289/article/details/103362740
    Lua大量字符串拼接方式效率对比及原因分析
    干货 | 携程多语言平台-Shark系统的高可用演进之路
  • 原文地址:https://www.cnblogs.com/susanhonly/p/7305032.html
Copyright © 2020-2023  润新知