性能测试
浅谈性能瓶颈之Mysql慢查询
1.开启测试环境的mysql数据库慢查询日志,然后在日志文件里自动记录这些慢查询,以及not using index的查询。数据库执行下面几个命令:
set global slow_query_log=on /*开启慢查询日志*/
set log_queries_not_using_indexes=on /*开启未用查询的日志*/
set global slow_query_log= “你想要的路径” /*该演示里使用默认路径*/
然后,执行如下命令,可以看到慢查询日志已经打开,并且可以看到慢查询日志存放的路径。
Show variables like ‘%slow%’
到这里我们已经开启了慢查询以及未走索引的查询日志记录,但是还差一步,那就是多慢的查询算慢查询?经过讨论,超过200毫秒的查询,都得记录分析调优。所以还需要执行:
Set long_query_time=0.1 /*超过100毫秒的都是慢查询*/
在测试环境做完上面设置后,就可以定期取日志,看到我们想看的慢查询记录,以及没有用到索引的查询。
下面是工作中的一个真实示例截图:
2.实时获取慢查询
在性能测试执行过程中,有时会发现某一个非常慢,此刻就需要实时找出正在执行的慢查询,我们可以借助下面的命令实现:
select id, 'user','host,db,command,'time',state, info
from information_schema.processlist where time >=0.1
这里的0.1秒可以根据自己需要调整,information_schema对应数据库的processlist表。
3.explain
explain关键字是mysql中sql优化的常用【关键字】,通常都会使用explain来【查看sql的执行计划,而不是执行sql】,从而快速的找出sql的问题所在。
上面主要讲了怎么找到慢查询,有了慢查询sql后,我们怎么分析呢?借助explain.
explain +sql 语句来查看执行计划;如,explain select * from user where id =2;
主要关注id(执行顺序)、type(表的扫描方式)、rows(检索数据需要扫描的行)、key(使用到的索引)、key_len(索引长度)、extra(额外信息)。
注意:
type=all,key=null,说明该查询做了全表扫描,索引没有起作用。
使用索引进行查询的时候,不要做任何的函数操作,不然会导致索引失效。