一、使用方法:EXPLAIN +sql语句;
EXPLAIN SELECT * FROM t1;
二、功能:EXPLAIN 是什么?查看表的执行计划
三、详解: EXPLAIN 能干嘛?
(1)表的读取顺序
(2)数据读取操作的操作类型
(3)哪些索引可以使用
(4)哪些索引被实际使用
(5)表之间的引用
(6)每张表有多少行被优化器查询
explain输出解释:
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
一.id:select查询的序列号,表示执行表的先后顺序。
(1).id相同时,执行顺序是由上至下。
EXPLAIN SELECT t2.* FROM t3,t1,t2 WHERE t2.m_id=t1.m_id AND t2.m_id=t3.m_id;
执行结果:
(2)id不同时,序号越大,优先级越高,越被优先执行,
EXPLAIN SELECT t2.* FROM t2 WHERE m_id=(SELECT m_id FROM t1 WHERE m_id=(SELECT m_id FROM t3 WHERE t3.m_id=5));
(3)id相同不同同时存在时,值越大越先执行,值相同的由上而下执行
EXPLAIN SELECT t2.* FROM (SELECT t3.m_id FROM t3 ) s1,t2 WHERE s1.m_id =(SELECT m_id FROM t1 WHERE t1.m_id=5);
二、select_type(数据读取的操作类型)
示查询中每个select子句的类型
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
三、type类型
代表访问类型,MySQL内部将其分为多类型,常用的类型从好到差的顺序展示如下:
system->const->eq_ef->ref->fulltext->ref_or_null->index_merge->unique_subquery->index_subquery->range->index->ALL;
而在实际开发场景中,比较常见的几种类型如下:const->eq_ref->ref->range->index->ALL(顺序从好到差),通常优化至少在range级别或以上,比如ref算是比较不错的啦;
上面说到的从好到差指的是查询性能。