MySQL性能调优,explain关键字怎么用?MySQL执行计划详细介绍

MySQL执行计划

 作为一个后端程序员,工作中免不了和数据库打交道,以MySQL数据库为例,同样的需求,有的人写的查询语句几秒就执行完了,而有的人写的SQL要执行几分钟甚至无法执行,那么怎么去调优我的SQL呢?MySQL提供了性能调优工具即EXPLAIN执行计划。

什么是explain?

  • MySQL提供的查询SQL语句执行效率的工具,通过返回信息供人们进行性能调优,书写格式如下:
EXPLAIN
SELECT * FROM TABLE [LEFT JOIN TABLE ...] WHERE [COLOMN IN (子查询)];

即在自己的SQL语句前加上explain关键字即可,返回的信息如下:
MySQL执行计划

接下来我们分析一下各个字段的含义。

各字段含义

  • id
    • select查询的顺序
    • 同id从上向下执行
    • 不同id时id越大的先被执行
    • 如果是子查询ID号会递增,即一个SQL中如果有子查询,先执行子查询
  • select_type
    • 查询的类型,用于区别SQL是普通查询还是子查询、关联查询等
    • 主要的参数有:
select_type参数意义
SIMPLE表明SQL是简单查询,不包含复杂的查询形式
PRIMARY查询中包含了复杂的查询,最外层为此标志
SUBQUERY在select或where列表中包含了子查询
DERIVEDfrom或join的表是通过select语句查询出来放到临时表里的,此参数代表了该临时表
UNIONunion的查询
UNION RESULTunion查询的结果
  • table
    • 本条数据表示的表
  • partitions
  • type
    • type是性能调优的重要指标,它代表了我们的SQL是以什么样的形式来访问表的,不同的访问形式查询的效率是不一样的。
    • 一般来说,好的查询type要达到range及以上才可以。
    • 他们之间的优劣如下,越靠前查询效率越高:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
type参数意义
system表中只有一行记录(系统表)
const通过一次索引就找到了,通常用于primary key或者unique索引,比如select * from table where id=1
eq_ref唯一性索引扫描,用于primary key或unique index,如SELECT * FROM table a LEFT JOIN table b on a.id=b.id
ref非唯一性索引扫描,使用了非唯一索引进行
range区间扫描,通常在where中使用了between或者in/not in
indexindex与all都是全表查询,区别在于,index只查询索引树,而all会查询非索引数据,index例子如SELECT id FROM table
all全表查询,例子如SELECT id,name FROM table
  • possible_keys
    • 查询涉及到的字段包含的所有索引及主键都会被列出
  • key
    • 实际上时用到的索引,没有用到则为空
  • key_len
    • 使用的索引在表中定义的长度(不代表实际使用的长度)
  • ref
    • 显示被使用的索引是哪一列,如果不确定,则是const。
  • rows
    • 查询按照执行计划id所规定的顺序执行时,上一执行计划从本执行计划获取一行数据时需要查询的行数。
  • extra
    • 重要信息
extra参数意义
Using filesort文件排序,代表至少有一个orderby中的字段没有索引,如select * from table order by name
Using temporary使用临时表保存中间结果,用于orderby,groupby
Using index表示查询的字段都有索引,如select id from table
Using where使用了where过滤
Using join buffer使用了连接缓存
Impossible WHEREwhere条件为不可能,不需要查询,如select * from table where 1<>1

总结

 在MySQL调优查看执行计划的时候最关键的数据便是typerows了,先要看有没有命中索引,再看每个流程需要检索的行数,只要命中索引(ref及以上),检索的行数也很小,那么,我们就可以说,这个SQL的执行效率很高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值