一文看懂 mysql执行计划

执行计划

官网介绍:使用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 ,表明索引用来读取数据而非执行查找动作
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值