执行计划
官网介绍:使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道Mysql是如何处理SQL语句,分析查询语句或表结构的性能瓶颈。
个人理解: 说白了就是SQL的检查单,类似于我们去医院看病医生开的单
怎么使用
explain + sql 语句
新建表
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`emp_id` varchar(50) NOT NULL COMMENT '员工表',
`emp_name` varchar(100) NOT NULL,
`emp_age` int(3) NOT NULL,
`emp_posi` varchar(200) NOT NULL,
`emp_sal` int(10) DEFAULT NULL,
PRIMARY KEY (`emp_id`),
KEY `index_name_age_posi` (`emp_name`,`emp_age`,`emp_posi`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('1000', '张三', '52', '广州', null);
INSERT INTO `emp` VALUES ('1001', '李四', '48', '深圳', null);
INSERT INTO `emp` VALUES ('1002', '王五', '50', '东莞', null);
INSERT INTO `emp` VALUES ('1003', '马六', '45', '惠州', null);
执行计划
explain SELECT
*
FROM
emp
WHERE 1=1
AND emp_name LIKE '张三'
AND emp_age = 52
AND emp_posi = '广州';
结果
各字段含义
id:
相同:执行顺序由上至下
不同:id值越大优先级越高,越先执行
相同又不同:id相同可以认为是一组,从上之下顺序执行,在所有组中,id值越大优先级越高越优先执行。
select_type:
simple: 简单的查询,查询中不包含子查询或union
primary: 查询中包含任何复杂的子部分,最外层则被标记为primary
subquery: 在select或where列表中包含了子查询
derived: 在from列表中包含了子查询,该子查询被标记为derived(衍生)临时表中
union: 第二个select 出现在union之后,则被标记为union
union result: 从union中获取的结果集
table:
显示所查询的行数据是来自于那张表
type:
all: 全表扫描
index: 使用索引
range: 范围检索
ref: 非唯一性索引扫描,返回匹配某个单独值的所有行
eq_ref: 唯一性索引扫描,对于每个索引,表中只有一条记录与之匹配。常见用于主键或唯一索引扫描
const: 表示通过索引一次就找到,用于比较primary_key或者unique索引 > system: 表只有一行记录,一般指系统表
null:
从最好到最差排序:system > const > eq_ref > ref > range > index > all
possible_keys
显示可能用到这张表的索引,一个或多个,查询涉及到的字段上若存在索引则该索引被列出,但是不一定被实际使用
key
实际使用到的索引,如果为null,则没有使用索引
key_len
索引字段的最大可能长度,并非实际使用长度
ref
显示索引的那一列被使用了,如果可能的话是一个常数。哪些列或常量被用于查找索引列上的值
rows
每张表有多少行被优化器查询
extra
包含不适合在其他列中显示但十分重要的额外信息 ,主要有如下几个重要参数
1、using filesort:文件内排序,无法用索引完成的排序,mysql 内部自己排序,group by尽量与索引顺序保持一致,如:索引为name_age_posi 查询为select * from emp where name = ‘张三’ order by posi;
2、using temporary:使用零时表保存中间结果
3、using index:使用了覆盖索引(查询列被所建的索引覆盖),避免访问了表的数据行
如同时出现using where 表明索引被用来执行索引建值的查找,
如果没有同时出现using where ,表明索引用来读取数据而非执行查找动作