Explain是怎么执行MySQL语句的

这篇文章主要介绍“Explain是怎么执行MySQL语句的”,在日常操作中,相信很多人在Explain是怎么执行MysqL语句的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Explain是怎么执行MysqL语句的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Explain

MysqL 中,我们一般常用 desc tableName 来查看一张表的信息,各个列的定义等、通过 Explain sql 来了解MysqL  是如何执行当前这条sql的 。

实际上 desc、describe、explain 都可以用来查看MysqL 是如何执行当前这条sql的,在 MysqL 8.0.19  之后,这三者的作用可以说是等价的,explain 也可以用来查看表信息。后面我们会直接以 explain 为例,来说明具体的作用。

官方文档说的明白, explain 可以和SELECT、INSERT、UPDATE、DELETE 一起工作,显示 MysqL  优化器的语句执行计划,即用来告诉用户 MysqL 会怎样执行这条 sql,以什么样的顺序,如果是多表的话是怎样 Join的。

输出字段官网文档截图如下:

Explain是怎么执行MySQL语句的

上面返回看似不少,不过我们重点关注 type、key、rows 这三个。

我们常见应用的场景都是读多写少,而且对于 sql 的执行的效率评估,一般也是说从已经存储的十成、百万甚至千万条数据中查询需要数据的效率。

后面以 SELECT 为例,来看看 explain 能带给我们什么帮忙和建议。

假设有如下表定义及数据:

CREATE TABLE `t3` (   `id` int NOT NULL,   `a` int DEFAULT NULL,   `b` int DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `a` (`a`) ) ENGINE=InnoDB;  delimiter ;; create procedure idata() begin    declare i int;   set i=1;   while(i<=100000) do     insert into t3 values(i,i,i);      set i=i+1;     end while;   end;; delimiter ; call idata();

执行完上述sql,我们来试想一下,在当前十万行数据的表中如果执行一条查询sql,那在少量数据中查找一定比全表查找要快很好。

比如我们最熟悉的通过主键查询

select a from t3 where id=100;

你会发现,explain 中 type 是 const, key 是 PRIMARY

Explain是怎么执行MySQL语句的

再比如执行

select  * from t3 where b=100;

这个时候, explain 告诉我们,查询类型是ALL,全表扫描:

Explain是怎么执行MySQL语句的

如果我们是想要把这个表里全部数据显示也就罢了,目前只查一条数据却执行全表扫描,explain 告诉我们扫描行可能会到9万多行,效率可想而知。

如果我们把sql 改成这样:

select * from t3 where a=100;

此时 explain 变成了这样:

Explain是怎么执行MySQL语句的

你会发现,type 变成了 ref, key 变成了a, rows 是1, 区别只在于 a 列上建立了索引,此时扫描行数变成了一行,差别太明显了。

如果我们要查找一个范围内的数据,通过主键或者包含索引的列进行查询时,

Explain是怎么执行MySQL语句的

扫描的还是有限行,此时type是range,但如果还是通过 b 做为条件进行过滤,那还是全表扫描:

Explain是怎么执行MySQL语句的

另外,为什么一般的sql优化建议里都会说别用 select * ,指定具体用到的列呢?

肯定是用到什么列的数据查什么数据更节省内存,传输,不要等到查出结果再在内存里进行过滤,此外更重要的一点是,每个创建的索引,都有自己的索引树,能够在索引树上完成查询操作,就不需要再回表去查询,效率当然会更高。

比如,我们把查询换成了

select a,id from t3 where a < 100;

此时,explain 会在Extra里告诉咱们,查询的时候没有回表,用到了index

Explain是怎么执行MySQL语句的

如果把查询列改成星,这个时候,就需要回表了,

Explain是怎么执行MySQL语句的

咱们前面说重点关注 type, key, rows,可以再看下 Extra, type 里查询效率从优到差,有

const

表中只有一行匹配,查询一次即可满足。常用来匹配主键或者唯一索引。

eq_ref

唯一索引

ref

非唯一索引

range

通过一个索引去查询,只扫描指定范围内的行。一般是在检索列中包含 =, <>, >, >=, <, <=, IS  NULL, <=>, BETWEEN, LIKE, or IN()

index

类似于全表扫描,区别在于只扫描索引树

all

全表扫描,效率最低的。

MysqL 8.0.18 开始,还加入了一个 explain  analyze,可以查看具体预计sql执行耗时,比如我们通过它来查看上面的几个命令,会有如下输出,你会更直观的感觉到加了索引带来的效率提升。

Explain是怎么执行MySQL语句的

Explain是怎么执行MySQL语句的

到此,关于“Explain是怎么执行MysqL语句的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程之家网站,小编会继续努力为大家带来更多实用的文章

相关文章

这篇文章主要介绍“hive和mysql的区别是什么”,在日常操作中...
这篇“MySQL数据库如何改名”文章的知识点大部分人都不太理解...
这篇文章主要介绍“mysql版本查询命令是什么”的相关知识,小...
本篇内容介绍了“mysql怎么修改字段的内容”的有关知识,在实...
这篇文章主要讲解了“mysql怎么删除unique约束”,文中的讲解...
今天小编给大家分享一下mysql怎么查询不为空的字段的相关知识...