优化思路:抓取(范围) 》定位(缩小范围) 》分析并给出建议
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,这就要看是先过滤再排序划算,还是先排序再过滤划算