1. explain是什么
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。
2. explain能干吗
可用于分析:
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
3. explain怎么分析
执行计划包含的信息如下:
各字段解释
3.1 id
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。
分为三种情况:
3.1.1 id相同,执行顺序由上至下
id相同,执行顺序从上到下,搭配table列进行观察可知,执行顺序为t1->t3->t2。
3.1.2 id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
如果是子查询id的序号会递增,id值越大执行优先级越高,搭配table列可知,执行顺序为t3->t1->t2。
3.1.3 id相同不同,同时存在
id如果相同,可认为是同一组,执行顺序从上到下。在所有组中,id值越大执行优先级越高。所以执行顺序为t3->derived2(衍生表,也可以说临时表)->t2。
总结:id的值表示select子句或表的执行顺序,id相同,执行顺序从上到下,id不同,值越大的执行优先级越高。
3.2 select_type
SIMPLE: 简单的select查询,查询中不包含子查询或者UNION
PRIMARY: 查询中包含任何复杂的子查询,最外层查询被标记为PRIMARY
SUBQUERY: 在SELECT或WHERE列表中包含子查询
DERIVED: 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里
UNION: 若第二个SELECT出现在UNION之后,则被标记为UNION; 若UNION包含在FROM子句的子查询中,外层SELECT被标记为: DERIVED
UNION RESULT: 从UNION表获取结果的SELECT
3.3 table
显示这一行的数据是关于哪张表的
3.4 type
访问类型,显示查询使用了何种类型,从最好