理论+实践,细谈MySQL中的explain执行计划之“谜”( 二 )
实践Partuse explain_detail;DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` (`id` int(11) NOT NULL comment '教师id',`teacher_name` varchar(45) DEFAULT NULL comment '姓名',`teacher_no` varchar(45) DEFAULT NULL comment '教师编号',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `teacher` (`id`, `teacher_name`, `teacher_no`)VALUES (1,'溪源a','150921'), (2,'溪源b','201010'), (3,'溪源c','200325'); DROP TABLE IF EXISTS `class`;CREATE TABLE `class` (`id` int(11) NOT NULL AUTO_INCREMENT comment '班级ID',`class_name` varchar(10) DEFAULT NULL comment '班级名称',PRIMARY KEY (`id`),KEY `idx_class_name` (`class_name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `class` (`id`, `class_name`)VALUES (1,'java1'),(2,'java2'),(3,'java3'); # 班级教师关系表DROP TABLE IF EXISTS `class_teacher`;CREATE TABLE `class_teacher` (`id` int(11) NOT NULL,`class_id` int(11) NOT NULL comment '班级ID',`teacher_id` int(11) NOT NULL comment '教师ID'PRIMARY KEY (`id`),KEY `idx_class_teacher_id` (`class_id`,`teacher_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;# 插入数据INSERT INTO `class_teacher` (`id`, `class_id`, `teacher_id`)VALUES (1, 1, 1), (2, 1, 2), (3, 2, 1);idexplain select (select id from teacher limit 1) from class;
文章插图
理论知识中介绍到id值越大执行优先级越高 , id值相同则从上往下执行 , id为null最后执行 。 从图中ID列 , 我们看到ID=2的先执行即先查询teacher表 。
select_type
- simple简单的select查询 , 查询中不包含子查询或者UNION;
文章插图- primary和subqueryprimary:查询中若包含任何复杂的子部分 , 标记最外层查询语句;subquery:在select或where列表中包含子查询,标记子查询语句;
explain select (select id from teacher) from class;
文章插图subquery子查询teacher表 , 外层select为primary 。
文章插图这条sql语句可以依据ID列 , 区分SQL语句的执行顺序 。
- derived在from列表中包含的子查询被标记为derived(衍生) , MySQL会递归执行这些子查询 , 把结果放到临时表中 。
explain select * from (select * from teacher limit 1) tmp;
文章插图依据ID=2 , 先查询teacher表 , 然后执行最外层查询 , 并将结果存入临时表 。
- union、union resultunion:若第二个select出现在union之后 , 则被标记为union;若union包含在from子句的子查询中 , 外层select将被标记为derived;故在union中第二个及之后的select 。 union result:从union临时表检索结果的select 。
explain select * from teacher where id = 1 union select * from teacher;
文章插图id=1为primary;说明是做外层查询 , 即此条sql语句from前面的语句;id=2为union;说明是union后面的查询语句;id=null,标记为UNION RESULT , 生成的临时表;两个的结果合并为union result , 供select 检索 。 再次说明下id列:1 , 2 , null , 执行顺序2 --> 1 --> null 。 先执行select 2 , 然后执行select 1 , 最后执行执行从两个笛卡尔积检索数据 。
table输出的行所引用的表;
- 当 from 子句中有子查询时 , table列是
格式 , 表示当前查询**依赖 id=N **的查询 , 于是先执行 id=N 的查询 。
文章插图- 当有 union 时 , UNION RESULT 的 table 列的值为
, 1和2表示参与 union 的 select行id 。
文章插图type
- nullMySql优化器能够在优化阶段分解查询语句 , 在执行阶段就不用访问表或索引 。
文章插图- system
文章插图- const表示通过索引一次就找到了 , const用于比较primary key 或者 unique索引(查询类型与索引类型有关) 。 因为只需匹配一行数据 , 所有很快 。 如果将主键置于where列表中 , mysql就能将该查询转换为一个const 。
- 混沌实施工具ChaosBlade实践
- GPU|干货|基于 CPU 的深度学习推理部署优化实践
- vivo|vivo影像+大师实践课的真正精髓:让更多人爱上手机影像
- 易观数科实践分享|教你 3 步快速搭建数据运营指标体系 | 观数
- 网易云音乐基于Flink实时数仓实践
- SpringCloud网关聚合Swagger接口文档实践
- 芦淞区第6届中小学生科技创新与实践技能大赛圆满闭幕
- 腾讯参与首届湾区创见安全大会,探讨云原生安全实践
- FedReID - 联邦学习在行人重识别上的首次深入实践
- 网易CI/CD实践(下):测试自动化及API版本管理
