explain有何用处呢:为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。
可以使用explain+SQL语句来模拟优化器执行SQL查询语句,从而知道mysql是如何处理sql语句的。通过查看执行计划了解执行器是否按照我们想的那样处理SQL。
explain执行计划中包含的信息如下:
- id: 查询序列号
- select_type: 查询类型
- table: 表名或者别名
- partitions: 匹配的分区
- type: 访问类型
- possible_keys: 可能用到的索引
- key: 实际用到的索引
- key_len: 索引长度
- ref: 与索引比较的列
- rows: 估算的行数
- filtered: 按表条件筛选的行百分比
- Extra: 额外信息
下面说下具体每一列的表示的含义和对应sql.
测试使用mysql版本5.7, 使用的3个表结构如下
CREATE TABLE `demo`.`emp` (
`emp_id` bigint(20) NOT NULL,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '姓名',
`empno` int(20) NOT NULL COMMENT '工号',
`deptno` int(20) NOT NULL COMMENT '部门编号',
`sal` int(11) NOT NULL DEFAULT 0 COMMENT '销售量',
PRIMARY KEY (`emp_id`) USING BTREE,
INDEX `u1`(`deptno`) USING BTREE,
UNIQUE INDEX `u2`(`empno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
CREATE TABLE `demo`.`dept` (
`id` bigint(20) NOT NULL,
`deptno` int(20) NOT NULL COMMENT '部门编码',
`dname` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '部门名称',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `dept_u1`(`deptno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
CREATE TABLE `demo`.`salgrade` (
`id` bigint(20) NOT NULL,
`losal` int(20) NULL DEFAULT NULL,
`hisal` int(20) NULL DEFAULT NULL,
`emp_id` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
一 id列
select查询的序列号(一组数字),表示查询中执行select子句或者操作表的顺序。
id列分为三种情况:
1、如果id相同,那么执行顺序从上到下
mysql> explain select * from emp e join dept d on e.deptno = d.deptno join salgrade sg on e.sal between sg.losal and sg.hisal;
2、如果id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行\
mysql> explain select * from emp e where e.deptno = (select d.deptno from dept d