mysql执⾏计划_MySQL执⾏计划
mysql执⾏计划
mysql的执⾏计划是对查询语句进⾏分析。了解查询语句的执⾏情况,出查询语句执⾏的瓶颈,从⽽对查询语句进⾏优化。MySQL提供了EXPLAIN和DESCRIBE语句⽤来查看SELECT语句执⾏过程。语法如下:
EXPLAIN [EXTENDED] SELECT select_options;
使⽤EXTENDED关键字,EXPLAIN语句将产⽣附加信息。执⾏EXPLAIN语句,可以分析后⾯的查询语句的情况。并能分析出所查询表的⼀些特征。
plc编程原理讲解例:
mysql> EXPLAIN SELECT * FROMstudent;+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | student | NULL | ALL | NULL | NULL | NULL | NULL | 4 | 100.00 | NULL |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
执⾏计划 id:
SELECT识别符,这是SELECT的查询序列号。表⽰的是查询中执⾏select⼦句或者是操作表的顺序。
1、id相同,执⾏顺序⾃上⽽下
哈夫曼树的构造特点
2、id不同, 如果是⼦查询,id的序号会递增,id值越⼤优先级越⾼,越先被执⾏。pythonide简单
3、id 有相同,也有不同,同时存在。id相同的可以认为是⼀组,从上往下顺序执⾏;在所有的组中,id的值越⼤,优先级越⾼,越先执⾏。
4、id为null, 表⽰⼀个结果集,不需要使⽤它查询,常出现在包含union等查询语句中
mysql语句的执行顺序
执⾏计划select_type
表⽰SELECT语句的类型,有以下⼏种取值:
(1)、SIMPLE表⽰简单查询,其中不包括⼦查询和UNION
(2)、PRIMARY表⽰主查询,或者是最外层的查询语句
asp文件怎么下载(3)、UNION 表⽰UNION中的第⼆个或更后⾯的的SELECT语句
(4)、DEPENDENT UNION 表⽰UNION查询中的第⼆个或更后⾯的SELECT语句,并且依赖外⾯的查询
解析,这条SQL的 select id from t_role where role_name = '学⽣' 并没有关联外部查询,但是被标记了DEPENDENT UNION。这是因为MySQL优化器会将 IN 操作符进⾏优化,将IN操作符中的⾮关联⼦查询优化为关联⼦查询。这种优化⽅式会导致对外层表全表扫描,如果外表太⼤性能并不是太好。例:
SELECT ... FROM t1 WHERE t1.a IN (SELECT b FROM t2);
类似语句会被该写为
SELECT ... FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.b = t1.a)
所以该SQL会被重写为这样
(5)、UNION RESULT表⽰UNION查询的结果
(6)、SUBQUERY表⽰⼦查询中的第⼀个SELECT语句。外层查询SELECT或者WHERE列表中包含⼦查询
(7)、DEPENDENT SUBQUERY表⽰⼦查询中的第⼀个SELECT ,依赖于外⾯的查询。
(8)、DERIVED表⽰派⽣表的SELECT(from⼦句中的⼦查询)
MySQL 5.7 之前的处理都是对 Derived table(派⽣表) 进⾏ Materialize(物化),⽣成⼀个 临时表 ⽤于保存 Derived table(派⽣表) 的结果,然后利⽤ 临时表 来协助完成其他⽗查询的操作,⽐如 JOIN 等操作。
MySQL 5.7 中对 Derived table(派⽣表) 做了⼀个新特性,该特性允许将符合条件的 Derived table(派⽣表) 中的⼦表与⽗查询的表合并进⾏直接 JOIN,类似于 Oracle 中的 ⼦查询展开,由优化器参数 optimizer_switch='derived_merge=ON' 来控制,默认为 打开。
但是 derived_merge 特性存在很多限制,当派⽣⼦查询存在以下操作时,该特性⽆法⽣效。DISTINCT、 GROUP BY、 UNION/UNION ALL 、 HAVING、 关联⼦查询、 LIMIT/OFFSET 以及 聚合操作 等。
5.7之后版本执⾏计划
(9)、MATERIALIZED  物化⼦查询
如下所⽰,如果dep_id字段没有索引,就会使⽤物化⼦查询。如果存在所有,则不会使⽤物化⼦查询。
create table department (id int primary keyauto_increment);create table employee (id int primary key auto_increment, dep_id int, key(dep_id));
(10)、UNCACHEABLE SUBQUERY  结果不能被缓存的⼦查询,外层查询需要使⽤的时候都要重新执⾏⼀次
(11)、UNCACHEABLE UNION  union中的第⼆个或者后⾯的不能被缓存的⼦查询
执⾏计划table
展⽰这⼀⾏的信息是关于哪张表的,不⼀定是实表,也有可能是以下⼏种值:
(1)、  该⾏指id值为M和N的⾏的并集。多出现在UNION语句中
(2)、  该⾏引⽤id值为N的⾏的派⽣表结果
(3)、  该⾏是指id值为N的⾏的物化⼦查询的结果
执⾏计划prititions
查询将从中匹配记录的分区。⾮分区表的值为 NULL
执⾏计划TYPE
type: 表⽰表的访问类型,下⾯按照最佳类型到最差类型的顺序给出各种连接类型。
(1)、null : 不访问任何表,索引、直接返回结果
(2)、system: 该表是仅有⼀⾏记录(等于系统表),是const类型的⼀个特例。该例⼦在mysql5.7版本将 optimizer_switch 变量
的 derived_merge 设置为off。
(3)、const: 表⽰通过索引⼀次就到了,const ⽤于⽐较primary key 或者 unique 索引。因为只匹配⼀⾏数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为⼀个常量。const于将"主键" 或 "唯⼀" 索引的所有部分与常量值进⾏⽐较。
(4)、eq_ref: primary key 或 unique key 索引的所有部分被连接使⽤ ,最多只会返回⼀条符合条件的记录,简单的 select 查询不会出现这种 type。类似ref,区别在于使⽤的是唯⼀索引,使⽤主键的关联查询,关联查询出的记录只有⼀条。常见于主键或唯⼀索引扫描
(5)、ref: 相⽐ eq_ref,不使⽤唯⼀索引,⽽是使⽤普通索引或者唯⼀性索引的部分前缀,索引要和某个值相⽐较,可能会到多个符合条件的⾏
(5)、fulltext : 连接使⽤全⽂索引
(6)、ref_or_null:类似ref,但是可以搜索值为NULL的⾏
(7)、index_merge: 表⽰使⽤了索引合并的优化⽅法。
(8)、unique_subquery: 该类型替换了下⾯形式的IN⼦查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是⼀个索引查函数,可以完全替换⼦查询,效率更⾼
(9)、index_subquery: 该联接类型类似于unique_subquery。可以替换IN⼦查询,但只适合下列形式的⼦查询中的⾮唯⼀索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
(10)、range: 范围扫描通常出现在 in(), between ,> ,= 等操作中。使⽤⼀个索引来检索给定范围的⾏
(11)、index:和ALL类似,不同就是mysql只需扫描索引树,这通常⽐ALL快⼀些
(12)、ALL: 即全表扫描,意味着mysql需要从头到尾去查所需要的⾏。通常情况下这需要增加索引来进⾏优化了
执⾏计划possible_keys
这⼀列显⽰查询可能使⽤哪些索引来查。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where ⼦句看是否可以创造⼀个适当的索引来提⾼查询性能。
执⾏计划key
这⼀列显⽰mysql实际采⽤哪个索引来优化对该表的访问。如果没有使⽤索引,则该列是 NULL。如果想强制mysql使⽤或忽视
possible_keys列中的索引,在查询中使⽤ force key  、 use key 、ignoe key等
执⾏计划key_len
这⼀列显⽰了mysql在索引⾥使⽤的字节数,通过这个值可以算出具体使⽤了索引中的哪些列。
举例来说,film_actor的联合索引 idx_film_actor_id 由 film_id 和 actor_id 两个int列组成,并且每个int是4字节。通过结果中的
key_len=4可推断出查询使⽤了第⼀个列:film_id列来执⾏索引查。
执⾏计划ref
critic的形容词英语ref列显⽰使⽤哪个列或常数与key⼀起从表中选择⾏。常见的有:const(常量),func,NULL,字段名(例:film.id)
执⾏计划rows
这⼀列是mysql估计要扫描并检测的⾏数,注意这个不是结果集⾥的⾏数
执⾏计划filtered
指返回结果的⾏占需要读到的⾏(rows列的值)的百分⽐,该值越⼤说明查询效果越好。
执⾏计划extra
extra: 表⽰查询时的额外信息。常见的主要信息如下:
(1)、const row not found:  类似于select …. from tbl_name,⽽表记录为空
(2)、Deleting all rows : 于DELETE,⼀些存储引擎(如MyISAM)⽀持⼀种处理⽅法可以简单⽽快速地删除所有的表⾏。 如果引擎使⽤此优化,则会显⽰此额外值

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。