mysql之explain用法

一、使用方法: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算是比较不错的啦;

上面说到的从好到差指的是查询性能。

原文地址:https://www.cnblogs.com/mimeng/p/14529811.html