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