MySQL之explain详解 学会优化SQL

导读:本篇文章讲解 MySQL之explain详解 学会优化SQL,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在SQL语句之间加上explain之后在执行就可以看到分析SQL相关信息:
Explain

根据上图所示对每一列都进行分析

id:select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

  • id相同,执行顺序由上至下
  • id不同,如果是子查询,id的序列号会递增,id值越大优先级越高,越先被执行
  • id有相同也有不同,id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
  • id为null的记录,union 或者union all查询结果会放到临时表中,看到表名格式为<union1,2>
    union查询

select_type:表示select的类型,常见有如下几种:

类型 说明
SIMPLE 简单表不使用表连接和子查询
PRIMARY 主查询,即外层的查询
DERIVED 在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在临时表里
SUBQUERY 子查询中的第一个
UNION UNION中的第二个或者后面的查询语句
UNION RESULT 从union表获取结果的select

table:输出查询语句的表名称或者表别名

type:表示MySQL在表种找到所需要行的方式或者叫做访问类型,从上到下性能由差到好

ALL 全表扫描
index 走索引的全表扫描
range 命中where自居的范围索引扫描
index_merge 索引合并
ref ;eq_ref 非唯一性索引扫描,返回匹配某个单独值的所有行。;一性索引扫描,对于每个索引键,表中只有一条记录与之匹配
const;system 常量扫描表示通过索引一次就找到了,单表最多有一个匹配

const/system

possible_keys:表查询可能使用到的索引

key:实际使用的索引

key_len:使用索引字段的长度

ref:使用哪一列与key一起从表种选择

rows:扫描行数量

Extra:执行情况的说明和描述,不适合在其他列中展示但是对执行计划重要的额外信息

主要有如下几种:

Using index(索引覆盖) 表示索引覆盖,不会回表查询
Using where(索引回表) 表示进行了回表操作
Using index condition(索引下推) 表示进行了ICP优化
Using fiesort 表示mysql需额外排序操作,不能通过索引顺序达到排序效果
Using temporary 使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by 和 group by
Using join buffer 使用join查询的时候会用到
Impossible WHERE where子句的值总是false,不能用来获取任何数据

Impossible WHERE

你知道的越多不知道的越多

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77231.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!