设为首页 加入收藏

TOP

SQL优化 MySQL版 -分析explain SQL执行计划
2019-03-09 00:20:46 】 浏览:21
Tags:SQL 优化 MySQL -分析 explain 执行 计划

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


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值越大,它就越往下排列;


PRIMARY:包含查询SQL中的子查询(最外层)


SUBQUERY:包含子查询SQL中的子查询(非最外层)


Simple:简单查询(一个SQL语句里面不包含子查询,union)都是简单查询


derived:衍生查询 触发子衍生查询只有两种:


1.在from子查询中,只有一张表


2.在from子查询中如果有两张表,比如 tablie1 union table2,则table1就是衍生查询;



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SQL优化 MySQL版 - B树索引详讲 下一篇SQL优化 MySQL版 - 索引分类、创..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }