MySql系列:MySQL 之 Explain 输出分析

MySQL 之 Explain 输出分析


前言

今天博主将为大家分享MySql系列:MySql系列:MySQL 之 Explain 输出分析,不喜勿喷,如有异议欢迎讨论!

这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中都会接触过这个。在工作中实际使用的可以用于分析sql语句的性能以便达到预期性能,是需要掌握的。(在之前的文章也有提到过–>MySql系列(一):查询优化)

Explain 可以使用在SELECT, DELETE, INSERT, REPLACE, and UPDATE 语句中,执行的结果会在每一行显示用到的每一个表的详细信息。简单语句可能结果就只有一行,但是复杂的查询语句会有很多行数据。


Explain 的使用

在 SQL 语句前面加上 explain,如:EXPLAIN SELECT * FROM a;

举个例子

CREATE TABLE `a` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_uid` (`uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8m64;

采用上面的语句EXPLAIN SELECT * FROM a;,效果如下

在这里插入图片描述
通过图片我们可以看到执行过后会输出 12 个字段,那么每个字段是什么意思呢?我们来一一看下

Explain 输出的字段内容

id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows,filtered,extra
字段含义
id查询语句的标识
select_type查询的类型
table当前行所查的表
partitions匹配的分区
type访问类型
possible_keys查询可能用到的索引
keymysql 决定采用的索引来优化查询
key_len索引 key 的长度
ref显示了之前的表在key列记录的索引中查找值所用的列或常量
rows查询扫描的行数,预估值,不一定准确
filtered查询的表行占表的百分比
extra额外的查询辅助信息

常用字段详细介绍
  1. id: 是用来顺序标识整个查询中 select 语句的,在嵌套查询中id越大的语句越先执行
  2. select_type:
  • simple: 简单的SELECT(不使用UNION或子查询)
  • primary: 最外面的SELECT
  • union: UNION中的第二个或更高的SELECT语句
  • dependent union: UNION中的第二个或更高的SELECT语句,取决于外部查询
  • union result: UNION的结果
  • subquery: 在子查询中首先选择SELECT
  • dependent subquery: 子查询中的第一个SELECT,取决于外部查询
  • derived: 派生表——该临时表是从子查询派生出来的,位于from中的子查询
  • uncacheable subquery: 无法缓存结果的子查询,必须为外部查询的每一行重新计算
  • uncacheable union: 在UNION中的第二个或更晚的选择属于不可缓存的子查询
  1. table: 每一行引用的表名
  2. type: 从上到下效果依次降低
  • system: const 的一种特例,表中只有一行数据
  • const: 当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。使用主键查询往往就是 const 级别的,非常高效
  • eq_ref: 最多只返回一条符合条件的记录,通过使用在两个表有关联字段的时候
  • ref: 通过普通索引查询匹配的很多行时的类型
  • fulltext: 全文索引
  • ref_or_null: 跟 ref 类似的效果,不过多一个列不能 null 的条件
  • index_merge: 此连接类型表示使用了索引合并优化。在这种情况下,输出行中的 key 列包含使用的索引列表,key_len包含所用索引的最长 key 部分列表
  • unique_subquery: 在使用 in 查询的情况下会取代 eq_ref
  • range: 范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range
  • index: 类似全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
  • ALL: 全表扫描
  1. possible_key: MySQL 可能采用的索引,但是并不一定使用
  2. key: MySQL 正真使用的索引名称
  3. rows: 预估的扫描行数,只能参考不准确
  4. extra: 该列包含了很多额外的信息,包括是否文件排序,是否有临时表等,很多时候这个字段很有用能提供很多信息

到这里MySql系列:MySql系列:MySQL 之 Explain 输出,分析分享完毕了,快去试试吧!


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!-------


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈永佳

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值