小鱼:小屌丝,你在干啥呢?出去溜达啊。
小屌丝:好的,给我10分钟时间,我排查个问题。
小鱼:好的, 不着急。
小鱼:走啊,再不走 就赶不上2路公共汽车了。
小屌丝:鱼哥, 再给我几分钟时间,问题还没定位到呢。
小鱼:啥问题啊,这么难定位。
小屌丝:就是 有一个慢SQL,但是… 但是 …
小鱼:不会不知道 如何定位慢SQL??
小屌丝:额… 确实 … 所以…
小鱼:我来。
关于慢查询, 我想做性能测试的同学最有感触,也最有发言权。
一个接口查询20条数据, 命名可以1一秒以内命中, 偏偏搞了30多秒的时间。
这有没有一种想翩翩起舞的 冲动。
但是,时刻要谨记, 冲动是魔鬼, 所以,切勿冲动。切勿冲动。
在想冲动的时候,就像小鱼这样,对自己说三句:冷静、冷静、冷静
接下来,我们就来聊一聊如何快速的定位慢查询。
我们,开发的同学,最常用的定位慢SQL的方式,就是通过日志来定位的。
MySQL的慢查询日志:
记录响应时间是否超过超过long_query_time设置的值;
扫描记录数是否小于min_examined_row_limit;
注:
log_slow_admin_statements:默认 =OFF,即 不会记录管理语句,需要手动开启, =ON;
log_queries_not_using_indexes:默认 =OFF,即不使用索引语句,需要手动开启 =ON;
如何使用慢查询日志,进行查询, 只有4步:
1、 开启慢查询;
set global slow_query_log = on
2、设置慢查询阈值;
set global long_query_time = 1
3、查找慢日志路径;
show global variables like "log_path"
4、查找慢日志文件名称;
show global variables like "log_filename"
这里说一下:
如果你想另辟新路, 使用第三方工具(mysqldumpslow)那也是非常的奈斯。
关于mysqldumpslow的使用,这里就不过多赘述了。如果对mysqldumpslow 感兴趣,可以自行跳转到官网。
小屌丝:鱼哥,如果遇到正在执行慢查询时,我们该如何操作?
小鱼:这个问题,很常见,但是也不是没有解决的办法,就是show processlist。
优点
正如上面小屌丝所说,看到正在执行的慢SQL,可能会引起数据库负载过高,这个时候,就需要使用 show processlist:
先 查询当前mysql有些线程正在运行;
分析哪些可以线程可以被Kill;
最后kill掉线程即可。
参数
了解了上面的参数,我们就来实例进行;
命令执行
mysql>show processlist\E` `*************************** 10. row ***************************` `Id: 3366986` `User: Carl_DJ` `Host: 10.211.255.192:89068` `db: test_db` `Command: ` `Time: 2` `State: User sleep` `Info: select sleep(10)`
这里,就是通过Time 来判断是否为慢SQL。
小屌丝:我屮艸芔茻,可以啊,鱼哥, 这讲的确实很明白。
小鱼:我没想到,你竟然会被慢SQL难住。
小屌丝:其实,我只是想让你多分享一点慢SQL的知识,并不是我被难住了。
关于MySQL的知识, 小鱼也有过很多的分享,例如:
其他的小鱼就不一一例举了, 如果想看更多关于mysql的知识,可以跳转到小鱼的MySQL专栏。
最后,再唠叨一句,我是奕然: