explain
type:访问类型,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,一般来说,至少达到range级别,最好能达到ref。
key:实际使用的索引,如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引。
ref:显示索引的哪一列被使用了。
Extra:额外信息,坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引。
参考:【MySQL优化】——看懂explain_漫漫长途,终有回转;余味苦涩,终有回甘-CSDN博客_explain
mysqldumpslow
-s 按照那种方式排序 c:访问计数 t:查询时间 l:锁定时间 r:返回记录 al:平均锁定时间 ar:平均访问记录数 at:平均查询时间
-t 是top n的意思,返回多少条数据。
-g 可以跟上正则匹配模式,大小写不敏感。
mysqldumpslow -s c -t 20 host-slow.log (访问次数最多的20个sql)
mysqldumpslow -s r -t 20 host-slow.log (返回记录集最多的20个sql)
mysqldumpslow -t 10 -s t -g “left join” host-slow.log (返回照查询时间最长且含有左连接前10个sql)
profile
profile可以对每一条sql的性能进行分析,但mysql5.7之后将被废弃,推荐使用performance schema。
是否开启: show variables like '%profiling%'; 或 SELECT @@profiling;
开启: set profiling=1;
分析:
show profiles;
show profile for query 2;
show profile cpu,block io,memory,swaps for query 2;
grep、awk
grep -E 'select' 201905_slow.log | awk -F 'from|where' '{print $2}' | awk '!a[$0]++' > 201905_table.txt 慢查询表名列表
grep 'wx_user' 201905_slow.log | wc -l 某表的慢查询次数
grep -B 2 'wx_user' 201905_slow.log | grep -E '# Query_time:' | awk -F ' ' '{print $3}' | awk '{sum+=$1} END {print sum}' 某表的慢查询总时长