[存]数据库慢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需要特别注意。如果个别出现,则做一些常规检查即可。

 

posted @ 2017-08-08 09:05  susanhonly  阅读(712)  评论(0编辑  收藏  举报