一 .介绍
EXPLAIN 命令用于SQL语句的查询执行计划。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息帮助你做出调优决策。
先解析一条sql语句,你可以看出现什么内容
EXPLAIN SELECT * FROM person,dept WHERE person.dept_id = dept.did and person.salary >20000
下面咱们详细的介绍一下 查询计划的结果列:
二. id : 查询序列号
查询序号即为sql语句执行顺序
EXPLAIN select * from person where dept_id =(select did from dept where dname ='python');
从 2 个表中查询,对应输出 2 行,每行对应一个表, id 列表示执行顺序,id 越大,越先执行,id 相同时,由上至下执行。
三.select_type :查询类型
select_type 列提供了 对表的查询类型。最常见的值包括SIMPLE、PRIMARY、DERIVED 和UNION。其他可能的值还有 UNION RESULT、SUBQUERY 等等.
2.1 simple 简单查询 (没有union和子查询)
对于不包含子查询和其他复杂语法的简单查询,这是一个常见的类型。
EXPLAIN SELECT * FROM person;
2.2 primary 最外层查询 (在存在子查询的语句中,最外面的select查询就是primary)
这是为更复杂的查询而创建的首要表(也就是最外层的表)。这个类型通常可以在DERIVED 和 UNION 类型混合使用时见到。
2.3 derived 子查询(在FROM列表中包含的子查询)
当一个表不是一个物理表时,那么这个就被叫做DERIVED
EXPLAIN SELECT *FROM (SELECT* FROM person LIMIT 5) AS s
2.4 subquery 映射为子查询(在SELECT或WHERE列表中包含了子查询)
这个select-type 的值是为使用子查询而定义的.
EXPLAIN SELECT person.*,(select 2 from person as p2) FROM person where dept_id = (select did from dept where dname='python');
2.5 union 联合
EXPLAIN SELECT * FROM personunion allselect * from person ;
2.6 union result 使用联合的结果
EXPLAIN SELECT * FROM personunion select * from person ;
四. table 输出的行所用的表
EXPLAIN SELECT * FROM person;
注意: table 列是EXPLAIN 命令输出结果中的一个单独行的唯一标识符。这个值可能是表名、表的别名或者一个为查询产生临时表的标识符,如派生表、子查询或集合。
五. type连接类型
type 列代表表示 查询计划的连接类型, 有多个参数,先从最佳类型到最差类型介绍 重要且困难
性能: null > system/const > eq_ref > ref > ref_or_null >index_merge > range > index > all
4.1 type=NULL 在优化过程中就已得到结果,不用再访问表或索引。
EXPLAIN SELECT max(id) FROM person;
4.2 type=const/system 常量
在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行;
表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以一定是用到primary key 或者unique 情况下才会是const,看下面这条语句
EXPLAIN SELECT * FROM person where id =2;
所以说可以理解为const是最优化的。
4.3 type=eq_ref 使用有唯一性 索引查找(主键或唯一性索引)
对于eq_ref的解释,