mysql 笛卡尔积影响_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

本文通过一个SQL查询示例,探讨了MySQL的查询优化和执行计划。作者分析了explain命令的输出,揭示了数据量较小的表会优先执行的原因,并解释了笛卡尔积的概念。此外,还提到了SQL查询中的id、Select_type等关键参数对执行顺序的影响。
摘要由CSDN通过智能技术生成

SQL优化 MySQL版 -分析explain SQL执行计划

作者 Stanley 罗昊

【转载请注明出处和署名,谢谢!】

首先我们先创建一个数据库,数据库中分别写三张表来存储数据;

course:课程表

teacher:教师表

teacherCarid:教师证表

d0dd438544d0d2bfe6f555c2b2fdb04e.png

20bf1aa1b04cc56505212f73011b2096.png

402884a4864007def8a3f3ec30609055.png

现在我把这三张表连起来查,查询条件:查询课程编号为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);

执行结果:

1c19383d5c00f4dc57b1f00bb4167d84.png

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);

执行看结果:

081f613f2f173fe6d052c36fe7547b44.png

先看id:

id此时此刻都是1,它们都对应我们的表 te 是我们的教师证表 t 就是教室表 c 是课程表

由此可见,我们编写的SQL语句它底层是先执行教师证表的,然后执行教室表,最后再执行课程表;

那这是为什么呢?

我们来分析一下数据:

course:课程表 有三条数据

teacher:教师表 有三条数据

teacherCarid:教师证表 有四条数据

难道是数据越少就先执行谁?我们不妨来做个试验看看,我再加几条数据:

现在我们的数据变更为:

course:课程表 有三条数据

teacher:教师表 有四条数据

teacherCarid:教师证表 有六条数据;

我们再看它的执行计划:

c29fcb5ea44d9a22d4e987b1e284a2c5.png

通过试验我们发现,确实谁少就先执行谁,但是我我们却发现,表的执行顺序是因数量的个数改变而改变,那它的原因是什么呢?为什么表的执行顺序会跟随个数而改变呢?

笛卡尔积

我们现在假设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就是衍生查询;

今日感悟:

如果你要烧一壶开水,生火到一半时发现柴不够了,你应该怎么办?

“赶紧去找?”

“去邻居接一下?”

“赶紧去买柴火?”

如果是我,我会把壶里的水倒掉一些,

懂得舍弃的人,或许能得到的会更多

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值