MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阈值的语句,阈值是指运行时间超过long_query_time值得SQL,超过该阈值的SQL语句则会被记录在慢查询日志中。long_query_time的默认值为10 。默认情况下,MySQL数据库并不启动慢查询日志,需要手动设置。
查看慢查询相关变量的SQL语句:
注:
- 修改变量可以使用:set global long_query_time=0.2;或者修改MySQL的配置my.conf
- 日志记录到系统的专用日志表中要比记录到文件耗费更多的系统资源。所以建议不要讲慢查询记录到表中。
慢查询日志的分析工具-mysqldumpslow
MySQL内置了mysqldumpslow用于解析MySQL慢查询日志。
语法:mysqldumpslow [options] [log_file ...]
常用选项options:
- -g pattern:只显示与模式匹配的语句,大小写不敏感;
- -r:反转排序顺序;
- -t N:top n,即返回前n条数据;
- -v:详细模式
- -s sort_type:排序输出类型,可选值如下:
t:按查询总时间排序;
l:按查询总锁定时间排序;
r:按总发送行排序;
c:按计数排序;
at:按查询时间或平均查询时间排序;
al:按平均锁定时间排序;
ar:按平均行发送排序。
默认情况下,mysqldumpslow按平均查询时间(-s at)排序。
示例:
#
mysqldumpslow 结果信息:
Count:匹配到的该类型的语句执行了几次
Time:匹配到的该类型的语句执行的最大时间
Lock:该类型语句执行时等待锁定的时间
Rows:单次返回的结果数
eg:
Count 2 Time=3.1s(8s) Lock=0.00s(0s) Rows=1.0(2),root[root]@localhost
即:执行了2次,执行最大时间3.1s,总花费时间8s,等待锁的时间0s,单次返回的结果数是1,2次总共返回2条记录
MySQL提供了EXPLAIN命令,可以对慢查询进行分析,并输出SELECT执行的详细信息,我们可以根据输出的信息进行慢查询优化。
eg
输出信息:
其中:
- id:查询的唯一标识符
- select_type: 查询的类型
- table:查询的表
- partitions:匹配的分区
- type:join类型
- possible_keys:查询中可能用到的索引
- key:查询中使用到的索引
- key_len:查询优化器使用了的索引字节数
- ref:与key一起被使用的字段或常量
- rows:当前的查询一共扫描了多少行
- filtered:查询条件过滤的数据百分比
- Extra:额外信息
产生慢查询的原因:
- 两张比较大的表进行join,但是没有给表相应的字段加索引
- 表存在索引,但是查询的条件过多,且字段顺序与索引顺序不一致
- 对很多查询结果进行group by
- 。。。。