mysql 笛卡尔积影响_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
SQL优化 MySQL版 -分析explain SQL执行计划
作者 Stanley 罗昊
【转载请注明出处和署名,谢谢!】
首先我们先创建一个数据库,数据库中分别写三张表来存储数据;
course:课程表
teacher:教师表
teacherCarid:教师证表
现在我把这三张表连起来查,查询条件:查询课程编号为2或教师证编号为3点老师信息;
通过这个例子,我们就可以把explain里面的参数一个一个的讲讲:
首先这个条件的主干是查询老师信息;
sql语句:select t.* From teacher t INNER JOIN course c INNER JOIN teachercarid te WHERE t.tid = c.cid AND t.tcid = te.tcid AND (c.cid = 2 or te.tcid = 3);
执行结果:
SQL语句很简单,我们不关心这个,我们关心的是在它前面加explain:
explainselect t.* From teacher t INNER JOIN course c INNER JOIN teachercarid te WHERE t.tid = c.cid AND t.tcid = te.tcid AND (c.cid = 2 or te.tcid = 3);
执行看结果:
先看id:
id此时此刻都是1,它们都对应我们的表 te 是我们的教师证表 t 就是教室表 c 是课程表
由此可见,我们编写的SQL语句它底层是先执行教师证表的,然后执行教室表,最后再执行课程表;
那这是为什么呢?
我们来分析一下数据:
course:课程表 有三条数据
teacher:教师表 有三条数据
teacherCarid:教师证表 有四条数据
难道是数据越少就先执行谁?我们不妨来做个试验看看,我再加几条数据:
现在我们的数据变更为:
course:课程表 有三条数据
teacher:教师表 有四条数据
teacherCarid:教师证表 有六条数据;
我们再看它的执行计划:
通过试验我们发现,确实谁少就先执行谁,但是我我们却发现,表的执行顺序是因数量的个数改变而改变,那它的原因是什么呢?为什么表的执行顺序会跟随个数而改变呢?
笛卡尔积
我们现在假设a b 两张表,a里面有三条数据,b里面有六条数据,最后他俩相乘 = 18;
我们假设现在有 a b c三张表,第一张表 a 是三条数据 第二张表是3条数据第三表的数据是4,那它们的笛卡尔积 2*3 = 6 6再*4 = 24;
这个时候我们换一下位置 a 是四条数据 b 是三条数据 c 是两条数据,我们再来算一下它们的笛卡尔积:3*4 = 12 *2 = 24;
我们发现两者结果都没有变,但是中间结果变了,第一次计算笛卡尔积时 第一次计算2*3 =6,第二次计算笛卡尔积时3*4 = 12,因为6比12小索所以它就先执行;
为什么在图上,c先执行的原因是 c * t (3*4 = 12)te 是6,所以比较大,就向后放;
结论:数据小的表,会优先查询;
ID值越大越优先执行
id值相同,就从上往下依次执行,如果不相同,那就从下往上执行,因为id值越大,它就越往下排列;
Select_type
PRIMARY:包含查询SQL中的子查询(最外层)
SUBQUERY:包含子查询SQL中的子查询(非最外层)
Simple:简单查询(一个SQL语句里面不包含子查询,union)都是简单查询
derived:衍生查询 触发子衍生查询只有两种:
1.在from子查询中,只有一张表
2.在from子查询中如果有两张表,比如 tablie1 union table2,则table1就是衍生查询;
今日感悟:
如果你要烧一壶开水,生火到一半时发现柴不够了,你应该怎么办?
“赶紧去找?”
“去邻居接一下?”
“赶紧去买柴火?”
如果是我,我会把壶里的水倒掉一些,
懂得舍弃的人,或许能得到的会更多
mysql 笛卡尔积影响_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积相关推荐
- mysql生成树状执行计划_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...
- mysql 执行计划extra_SQL优化 MySQL版 -分析explain SQL执行计划与Extra
Extra 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:此文章必须有一定的Mysql基础,或观看执行计划入门篇传送门: https://www.cnblogs.com/Sta ...
- mysql 单表查询 优化_SQL优化 MySQL版 - 单表优化及细节详讲
单表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...
- mysql 几阶b树_SQL优化 MySQL版 - B树索引进阶详讲(一)
SQL优化 MySQL版 - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 索引分类 单值索引 单的意思就是单列的值,比如说有一张数据库表,表内有三个字段,分别 ...
- MySQL(三)——SQL执行计划分析
目录 一.SQL执行计划概述 二.explain字段详解 1.id 2.select_type 3.possible_keys 4.key 5. key_len 6.ref 7.rows 8.Extr ...
- 开启Mysql慢查询来优化mysql
开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...
- Mysql 慢查询 Sql执行计划 SQL每阶段的耗时
文章目录 前言 一.慢查询的相关参数 slow_query_log 是否开启了慢查询 开启慢查询 slow_query_log_file 指定慢查询日志的存储路径及文件 long_query_time ...
- Mysql中的explain查看执行计划
Mysql中的explain查看执行计划 1.explain是什么? 查看执行计划. 2.怎么使用? explain + sql语句. 3.执行计划包含的信息: id,select_type,tabl ...
- Mysql基础(十六):explain命令SQL执行计划
目录 写在前面 1.通过explain命令得到的SQL执行计划(1) 2.通过explain命令得到的SQL执行计划(2) 3.通过explain命令得到的SQL执行计划(3) 4.通过explain ...
最新文章
- 机器学习-贝叶斯分类器
- python链表的创建_《大话数据结构》配套源码:链表(Python版)
- SQL语句 SELECT LIKE用法详解
- 14-angular.isDefined
- 【QT 数据库专辑】【04】WIN7下搭建本地SQL SERVER数据库 - 手把手-登录远程数据库帐号设定问题
- 动易生成栏目时报错“您的栏目页模板有误,缺少小类模板!”,一个解决办法...
- ios拇指社保应用源码
- 【Python实例第4讲】填补缺失值
- 微服务架构的理论基础 - 康威定律
- 安信可IDE 1.5编译ESP8266 RTOS 3.0
- 相片打印机原理_【视界网】什么是便携式打印机以及工作原理有哪些呢?
- 基于机器学习的量化投资策略
- 游戏安全--手游安全技术入门笔记
- 【开源】这个人脸生成器厉害了,网红脸、明星脸、萌娃脸通通都有
- getAttribute()用法
- (二)提升树模型:Xgboost原理与实践
- 加快人工智能与学生学习等融合,实现教育更高质量发展
- linux命令名字由来--整理
- itchat实现微信聊天机器人,定时发送微信消息,消息防撤回,消息监控,自定义回复消息
- 【输入法】 关于win自带的输入法不能打出中文标点
热门文章
- 光滑噪声数据常用的方法_如何处理噪声数据
- CAD中用多重插入块加密的图纸怎么分解?
- Oracle EBS R12 AP应付模块 查询发票付款信息SQL
- NeurIPS 2022 | 最强斗地主AI!网易互娱AI Lab提出基于完美信息蒸馏的方法
- 【C语言练习题】斐波那契
- springboot毕设项目大学生助学贷款管理系统w659v(java+VUE+Mybatis+Maven+Mysql)
- 计算机网络自顶向下方法 习题参考答案 第四章
- HTTP状态码大全(整理)
- Android Audio AudioHardwareALSA::openOutputStream函数
- ZZULIOJ 1170