目录
1. 概述
在平时的开发工作中,少不了数据库的使用,那么就会涉及到sql语句,如何知道sql语句执行的过程,以及sql语句执行的性能,通过执行计划模拟优化器执行sql进行分析
2. 执行计划使用
语法:EXPLAIN/DESC + SQL语句
例如:explain select * from user;
执行计划输出内容:
EXPLAIN SELECT * FROM test_tb1;
执行计划id、查询类型、查询表、分区,索引使用情况、表之间的引用等
2.1.执行计划详解
2.1.1. 执行计划-ID
select查询序列号,如果id相同,则从上到下顺序执行,如果不相同,序列号大的优先级比较高,先执行
ID相同:
EXPLAIN SELECT * FROM t1,t2,t3 WHERE t1.`id`=t2.`t1_id` AND t2.`id`=t3.`t2_id`;
ID不同:
EXPLAIN SELECT t1.* FROM t1 WHERE t1.`id`=
(SELECT t2.`t1_id` FROM t2 WHERE t2.`id`=
(SELECT t3.`t2_id` FROM t3 WHERE t3.`id`=1));
2.1.2.执行计划select_type
查询类型主要用来说明查询的类型:普通查询、联合查询、子查询等
序号 | select_type | 说明 |
1 | SIMPLE | 简单的查询,查询中不饱和子查询或者Union |
2 | PRIMARY | 查询中包含任何复杂的子查询,最外层的查询类型为PRIMARY |
3 | SUBQUERY | SELECT或者where中包含子查询 |
4 | DERIVED | 在from中包含子查询被标记为DERIVED(衍生),Mysql会递归查询这些子查询,将查询结果放入临时表 |
5 | UNION | 第二个select中查询UNION,则被标记为UNION,如果UNION出现在from子查询中,最外层被标记为DERIVED |
6 | UNION RESULT | 从UNION表获取结果的select |
SIMPLE举例:
sql语句:EXPLAIN SELECT * FROM t1;
PRIMARY、SUBQUERY举例:
sql语句: EXPLAIN SELECT id,(SELECT NAME FROM t2 WHERE t2.`id`=1) FROM t1;
2.1.3.执行计划-table
表示查询数据所在的表
2.1.4.执行计划-type
type代表访问类型,是判断sql执行性能比较关键的一个字段,性能从高到低依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
system:表示只有一条数据,类似于系统表,是const的一种特例
const:表示通过索引一次就查询到数据,比较块,用于primary key(主键)和unique唯一索引
eq_ref:用于“=”运算符比较的索引列
EXPLAIN SELECT * FROM t1,t2 WHERE t1.id = t2.id;
ref:非唯一索引扫描
rang:检索给的范围的值,使用一个索引进行选择,where后面使用between、>、<、in等
EXPLAIN SELECT * FROM t1 WHERE id > 0;
index:当前查询的结果全部为索引列,虽然也是全部扫描,但是只查询索引数据,没有之间查询数据
EXPLAIN SELECT id FROM t1 WHERE id > 0;
all:遍历全部查询
EXPLAIN SELECT * FROM t1;
2.1.5.执行计划possible_key和key
possible_key:可能使用的索引
key:实际使用的索引,如果为null,表示没有用到索引
2.1.6.执行计划key_len
表示索引中使用的字节数,可以根据这个字段计算查询中索引使用的长度,长度越短越好。
2.1.7.执行计划ref
表示索引的哪一列被使用
根据ref可以看出test库的t1表的id索引被使用
2.1.8.执行计划rows
根据表统计信息和索引选用情况,大致计算出查询到所需数据需要查询的行数
2.1.9.执行计划Extra
using where:表示使用了where过滤
using index:表示使用了覆盖索引,避免使用表数据
using join buffer:表示使用了链接缓存