zoukankan      html  css  js  c++  java
  • 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

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

    执行看结果:

    先看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就是衍生查询;

    今日感悟:

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

    “赶紧去找?”

    “去邻居接一下?”

    “赶紧去买柴火?”

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

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

    作者:罗昊 感谢各位阅读学习, 如果有疑问或纠错请在评论区留言与我交流,再次感谢各位读者的支持
  • 相关阅读:
    Python之eval的使用
    Python文件操作
    Python异常处理
    Python设计模式之单例模式
    Python面向对象
    Minimum Window Substring
    Minimum Size Subarray Sum
    Find Minimum in Rotated Sorted Array II
    Closest Binary Search Tree Value II
    Closest Binary Search Tree Value
  • 原文地址:https://www.cnblogs.com/StanleyBlogs/p/10422202.html
Copyright © 2011-2022 走看看