前言
如何写出效率高的SQL语句,提到这必然离不开Explain执行计划的分析,至于什么是执行计划,如何写出高效率的SQL,本篇文章将会一一介绍。
执行计划
执行计划是数据库根据 SQL 语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的。
使用explain关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的,分析你的 select 语句或是表结构的性能瓶颈,让我们知道 select 效率低下的原因,从而改进我们的查询。
explain 的结果如下:
下面是有关各列的详细介绍,重要的有id、type、key、rows、extra。
id
select_type
查询的类型,主要用于区分普通查询、联合查询、子查询等复杂的查询;
simple:表示查询中不包括 union 操作或者子查询,位于最外层的查询的 select_type 即为 simple,且只有一个;
explain select * from t3 where id=3952602;
primary:需要 union 操作或者含有子查询的 select,位于最外层的查询的 select_type 即为 primary,且只有一个;
explain select * from (select * from t3 where id=3952602) a ;
derived:from 列表中出现的子查询,也叫做衍生表;mysql 或者递归执行这些子查询,把结果放在临时表里。
explain select * from (select * from t3 where id=3952602) a ;
subquery:除了 from 子句中包含的子查询外,其他地方出现的子查询都可能是 subquery。
explain select * from t3 where id = (select id from t3 whereid=3952602 ) ;
union:若第二个 select 出现在 union 之后,则被标记为 union;若 union 包含在 from 子句的子查询中,外层 select 将被标记为 derived。
explain select * from t3 where id=3952602 union all select * from t3;
union result:从 union 表获取结果的 select ,因为它不需要参与查询,所以 id 字段为 null。
explain select * from t3 where id=3952602 union all select * from t3;
dependent union:与 union 一样,出现在 union 或 union all 语句中,但是这个查询要受到外部查询的影响;
dependent subquery:与 dependent union 类似,子查询中的第一个 SELECT,这个 subquery 的查询要受到外部表查询的影响。
table
表示 explain 的一行正在访问哪个表。
type
访问类型,即 MySQL 决定如何查找表中的行。
依次从好到差:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,除了 all 之外,其他的 type 都可以使用到索引,除了 index_merge 之外,其他的 type 只可以用到一个索引。一般来说,得保证查询至少达到 range 级别,最好能达到 ref。
possible_keys
显示查询可能使用到的索引。
key
显示查询实际使用哪个索引来优化对该表的访问;
select_type 为 index_merge 时,这里可能出现两个以上的索引,其他的 select_type 这里只会出现一个。
key_len
ref
显示哪个字段或者常数与 key 一起被使用。
rows
表示 MySQL 根据表统计信息及索引选用情况,大致估算的找到所需的目标记录所需要读取的行数,不是精确值。
extra
不适合在其他列中显示但十分重要的额外信息。
这个列可以显示的信息非常多,有几十种,常用的有:
类型 | 说明 |
---|---|
Using filesort | MySQL 有两种方式可以生成有序的结果,通过排序操作或者使用索引,当 Extra 中出现了 Using filesort 说明 MySQL 使用了后者,但注意虽然叫 filesort 但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是 ordery by,group by 语句的结果,这可能是一个 CPU 密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。 |
Using temporary | 用临时表保存中间结果,常用于 GROUP BY 和 ORDER BY 操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。 |
Not exists | MYSQL 优化了 LEFT JOIN,一旦它找到了匹配 LEFT JOIN 标准的行, 就不再搜索了。 |
Using index | 说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现 using where,表明索引被用来执行索引键值的查找,没有 using where,表明索引用来读取数据而非执行查找动作。这是 MySQL 服务层完成的,但无需再回表查询记录。 |
Using index condition | 这是 MySQL 5.6 出来的新特性,叫做“索引条件推送”。简单说一点就是 MySQL 原来在索引上是不能执行如 like 这样的操作的,但是现在可以了,这样减少了不必要的 IO 操作,但是只能用在二级索引上。 |
Using where | 使用了 WHERE 从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra 列出现 Using where 表示 MySQL 服务器将存储引擎返回服务层以后再应用 WHERE 条件过滤。 |
Using join buffer | 使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接 |
impossible where | where 子句的值总是 false,不能用来获取任何元组 |
select tables optimized away | 在没有 GROUP BY 子句的情况下,基于索引优化 MIN/MAX 操作,或者对于 MyISAM 存储引擎优化 COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。 |
distinct | 优化 distinct 操作,在找到第一匹配的元组后即停止找同样值的动作 |
filtered
关于 MySQL 执行计划的局限性
查询计划案例分析
执行顺序
总结
到此这篇关于Mysql深入探索之Explain执行计划的文章就介绍到这了,更多相关Mysql Explain执行计划内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
主要内容:1 调用EXPLAIN,2 EXPLAIN中的列,2.1 id,2.2 select_type,2.3 table,2.4 type,2.5 possible_keys,2.6 key,2.7 key_len,2.8 ref,2.9 rows,2.10 Extra详细介绍了MySQL EXPLAIN执行计划的各个字段的含义以及使用方式。 调用EXPLAIN可以获取关于查询执行计划的信息,以及如何解释输出。EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法,但该动能也有局限性,
本文向大家介绍MySql中如何使用 explain 查询 SQL 的执行计划,包括了MySql中如何使用 explain 查询 SQL 的执行计划的使用技巧和注意事项,需要的朋友参考一下 explain命令是查看查询优化器如何决定执行查询的主要方法。 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的。 1、什么是MySQL执行计划
本文向大家介绍深入探索Java常量池,包括了深入探索Java常量池的使用技巧和注意事项,需要的朋友参考一下 Java的常量池通常分为两种:静态常量池和运行时常量池 静态常量池:class文件中的常量池,class文件中的常量池包括了字符串(数字)字面值,类和方法的信息,占用了class文件的大部分空间。 运行时常量池:JVM在完成加载类之后将class文件中常量池载入到内存中,并保存在方法区中。平
问题内容: 从查询计划来看,如何确定最能在哪里进行优化? 我很欣赏要检查的第一件事是是否使用了良好的索引,但是除此之外,我有些困惑。通过过去的反复试验,我有时发现执行连接的顺序可以很好地改进,但是从执行计划中如何确定呢? 尽管我非常想对如何优化查询有一个很好的一般理解(建议多加赞赏!),但我也意识到,讨论具体案例通常比抽象讨论要容易得多。由于我目前正在用这个把头撞在墙上,因此您的想法将不胜感激:
本文向大家介绍Mysql Explain 详细介绍,包括了Mysql Explain 详细介绍的使用技巧和注意事项,需要的朋友参考一下 Mysql Explain 这里做一个资料的全面整理。 一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +----+---------
本文向大家介绍MySQL中EXPLAIN命令详解,包括了MySQL中EXPLAIN命令详解的使用技巧和注意事项,需要的朋友参考一下 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上explain就可以了: 如: EXPLAIN列的解释: select_type 1) SIMPLE:简单的S