MySQL慢查询与语句分析Explain

本文介绍MySQL慢查询的配置与分析,包括慢查询日志的开启、调整与分析工具mysqldumpslow的使用,以及如何利用Explain进行SQL执行计划的解读与优化。

慢查询

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%';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值