MySQL的执行计划explain的使用
1、explain的简介
explain是sql分析工具,可以模拟优化器执行查询语句,帮助我们发现查询瓶颈、优化查询语句
作用:
表的读取顺序
可能使用到的索引
实际使用到的索引
sql执行时的查询类型
每张表有多少数据被扫描
sql语句性能分析
2、id
每个select都有一个对应的id,id列是自增的
如果id序号相同,执行顺序为从上往下
如果id序号不相同,执行顺序为id大的先执行
如果即存在id相同和id序号大的情况,先执行序号大的,id相同的从上往下执行
如果id存在null的,最后执行,表示结果集,并且不需要他来查询
3、select_type
表示select查询时执行的查询执行类型
simple:简单查询,不包含union和子查询
EXPLAIN SELECT
*
FROM
t_user
primary:复杂查询中最外层查询,比如使用union和union all时,id为1的select_type通常为primary
EXPLAIN SELECT
id
FROM
t_USER UNION
SELECT
id
FROM
t_order;
subquery: select中出现子查询语句,结果不依赖于外部查询(不在from语句中)
EXPLAIN SELECT t_user.*,( SELECT user_id FROM t_order WHERE id = 1 )
FROM
t_user;
dependent subquery: select中出现子查询语句,结果依赖于外部查询
EXPLAIN SELECT
t_user.*,
( SELECT DISTINCT user_id FROM t_order WHERE user_id = t_user.id )
FROM
t_user;
**derived:**派生表,在from子句的查询语句中,表示数据从外部数据推导而来,而不是从select语句中的其他列选择
select * from (select id,username from user where id=1) as temp
union : 分为union和union all 两种,如果第二个select 语句在union之后,则被标记为union,如果union被包含在from中,则第一个select被标记为drived
union会去重,union all不会去重
EXPLAIN SELECT
*
FROM
( SELECT id FROM t_product WHERE price = 10 UNION SELECT id FROM t_user WHERE NAME = '张三' UNION SELECT id FROM t_order WHERE id = 2 ) AS temp
dependent union: 当union作为子查询,第一个union为dependent subquery ,第二个union为dependent union
EXPLAIN SELECT
*
FROM
t_order
WHERE
id IN (
SELECT
id
FROM
t_product
WHERE
price = 10 UNION
SELECT
id
FROM
t_user
WHERE
NAME = '张三' UNION
SELECT
id
FROM
t_order
WHERE
id = 2
)
3、table
select执行时查询的表名
4、partitions
表分区情况
5、type
select执行时所使用的访问类型
效率由高到低分别为:system->const->eq_ref->ref->range->index->all
6、possible_keys
可能使用的索引
7、key
实际使用的索引
8、key_len
使用的索引长度