MySQL数据库抓取慢sql

优化思路:抓取(范围) 》定位(缩小范围) 》分析并给出建议

1、抓取,首先开启mysql慢查询

   mysql服务器中找到my.Conf的配置文件,slow_query_log=1表示将大于1秒的sql语句抓取出来,slow_query_log_file=/var/log/mysql/slowquery_jumei.log表示将日志输出到/var/log/mysql/slowquery_jumei.log

   注意:配置文件改动后重启服务(service XXX restart)/重启机器(reboot)

   重启成功后使用mysql客户端验证慢查询是否开启成功,如下图:

 

 

2、缩小范围,使用mysqldumpslow分析慢查询抓取到的日志文件   

① mysqldumpslow -s c -t 5 /var/log/mysql/slowquery.log可以看出访问次数最多的5个sql语句

② mysqldumpslow -s r -t 5 /var/log/mysql/slowquery.log可以看出返回记录集最多的5个sql

③ mysqldumpslow -t 5 -s t -g  “ left join”  /var/log/mysql/slowquery.log按时间返回前5条里面含有左连接的sql语句

 

3、抓到sql语句后使用explain优化sql

   用法:explain后跟要优化的sql语句

 

4、重点关注点:

① type 表示mysql在表中找到所需行的方式,又称“访问类型”,常见类型如下:从左至右,有最差到最好:

        All  index  range  ref  eq_ref  const  system  null

② Key显示mysql在查询中实际使用的索引,若没有使用索引,显示为null

③ Rows 表示mysql根据表统计信息以及索引选用情况,估算找到所需记录需要读取的行数(越小越好)

④ Extra

        如果是only index 这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

        如果是where used ,就是使用上了where限制。

        如果是impossible where 表示用不着where,一般就是没查出来啥。

        如果此信息显示Using filesort 或者Using temporary的话会很吃力,where和order by的索引经常无法兼顾,如果按照where来确定索引,那么在order by时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算