慢查询
MySQL中可以记录慢查询(查询时间超过设定时间的)
>show variables like 'slow%';
查看慢查询设定
>set global long_query_time=0.5
设定记录所有时间超过500ms的查询;若log_queries_not_using_indexes=1的话,则未使用索引的查询也会被记录,若因此使log变的太大,则关掉。
使用mysqldumpslow可对慢查询日志进行分析:
-
-s:排序的方式:
-
c:访问计数;
-
l:锁定时间;
-
r:返回记录;
-
t:查询时间;
-
al:平均锁定时间;
-
ar:平均访问记录数;
-
at:平均查询时间;
-
-
-t:top n的意思,返回多少条记录;
-
-g:可使用正则匹配(大小写不敏感);
mysqldumpslow -s t -t 10 -g "test" myslow.log
查询时间最长且包含test字符的10条记录。
Explain
找到慢查询后,我们需要使用Explain(在查询语句前增加此关键字即可)来分析执行慢的原因,分析显示信息有:
-
id:选择标识符,指示执行顺序
-
id相同:执行从上到下
-
id不同:从大到小
-
-
select_type:查询类型
-
SIMPLE:简单查询
-
PRIMARY:复杂查询时,最外层select标记为PRIMARY;
-
UNION:联合查询时,非第一个查询(第二个及后面的);
-
DEPENDENT UNION:一般是子查询中的第二个SELECT或后面查询,取决于后面的查询;
-
UNION RESULT:联合查询结果;
-
SUBQUERY:子查询第一个查询,结果不依赖外部查询;
-
DEPENDENT SUBQUERY:子查询第一个查询,结果依赖外部查询;
-
DERIVED:派生表的SELECT;
-
-
table:数据源表名
-
partition:匹配的分区
-
type:表的访问方式,直接反应SQL语句是否高效,优化时重点关注的字段,性能由差到好 ALL、index、range、 ref、eq_ref、const、system、NULL:
-
system:表只有一行记录,是const特例,一般不会出现;
-
const:通过一次索引即可找到(一般为primary或unique索引),当MySQL对查询进行优化后会转换为一个常量;
-
eq_ref:唯一性索引扫描。一般是关联查询时,关联条件是主键或唯一索引;
-
ref:非唯一性索引扫描,返回匹配的所有行;
-
range:检索指定范围内行,一般是>、<、in、between查询;
-
index:遍历索引树,通常比ALL快(索引文件一般较小);
-
ALL:遍历全表
-
-
possible_keys:可能使用的索引
-
key:实际使用的索引
-
ref:被使用的列
-
rows:估算需要读取的行数
-
filtered:选取行和需要读取行的百分比
-
extra:执行情况描述和说明
-
Using filesort:使用外部索引排序,而非表内索引顺序;一般需要优化;
-
Using temporary:使用临时表保存中间结果,常见于order by和group by;最好去做优化;
-
Using Index:直接能从索引中取值;
-
Using where:使用了where过滤;
-
Using index condition:表示查询中有非索引的列,先用索引查询然后再返回行获取其他所需内容;
-
Using join buffer:使用了链接缓存(可能链接条件没有索引);
-
Impossible where:where总是false;
-
explain select * from emp where name = 'abcde%';
本文介绍MySQL慢查询的配置与分析,包括慢查询日志的开启、调整与分析工具mysqldumpslow的使用,以及如何利用Explain进行SQL执行计划的解读与优化。
446

被折叠的 条评论
为什么被折叠?



