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执行计划与笛卡尔积相关推荐

  1. mysql生成树状执行计划_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

    SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...

  2. mysql 执行计划extra_SQL优化 MySQL版 -分析explain SQL执行计划与Extra

    Extra 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:此文章必须有一定的Mysql基础,或观看执行计划入门篇传送门: https://www.cnblogs.com/Sta ...

  3. mysql 单表查询 优化_SQL优化 MySQL版 - 单表优化及细节详讲

    单表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...

  4. mysql 几阶b树_SQL优化 MySQL版 - B树索引进阶详讲(一)

    SQL优化 MySQL版  - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 索引分类 单值索引 单的意思就是单列的值,比如说有一张数据库表,表内有三个字段,分别 ...

  5. MySQL(三)——SQL执行计划分析

    目录 一.SQL执行计划概述 二.explain字段详解 1.id 2.select_type 3.possible_keys 4.key 5. key_len 6.ref 7.rows 8.Extr ...

  6. 开启Mysql慢查询来优化mysql

    开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...

  7. Mysql 慢查询 Sql执行计划 SQL每阶段的耗时

    文章目录 前言 一.慢查询的相关参数 slow_query_log 是否开启了慢查询 开启慢查询 slow_query_log_file 指定慢查询日志的存储路径及文件 long_query_time ...

  8. Mysql中的explain查看执行计划

    Mysql中的explain查看执行计划 1.explain是什么? 查看执行计划. 2.怎么使用? explain + sql语句. 3.执行计划包含的信息: id,select_type,tabl ...

  9. Mysql基础(十六):explain命令SQL执行计划

    目录 写在前面 1.通过explain命令得到的SQL执行计划(1) 2.通过explain命令得到的SQL执行计划(2) 3.通过explain命令得到的SQL执行计划(3) 4.通过explain ...

最新文章

  1. 机器学习-贝叶斯分类器
  2. python链表的创建_《大话数据结构》配套源码:链表(Python版)
  3. SQL语句 SELECT LIKE用法详解
  4. 14-angular.isDefined
  5. 【QT 数据库专辑】【04】WIN7下搭建本地SQL SERVER数据库 - 手把手-登录远程数据库帐号设定问题
  6. 动易生成栏目时报错“您的栏目页模板有误,缺少小类模板!”,一个解决办法...
  7. ios拇指社保应用源码
  8. 【Python实例第4讲】填补缺失值
  9. 微服务架构的理论基础 - 康威定律
  10. 安信可IDE 1.5编译ESP8266 RTOS 3.0
  11. 相片打印机原理_【视界网】什么是便携式打印机以及工作原理有哪些呢?
  12. 基于机器学习的量化投资策略
  13. 游戏安全--手游安全技术入门笔记
  14. 【开源】这个人脸生成器厉害了,网红脸、明星脸、萌娃脸通通都有
  15. getAttribute()用法
  16. (二)提升树模型:Xgboost原理与实践
  17. 加快人工智能与学生学习等融合,实现教育更高质量发展
  18. linux命令名字由来--整理
  19. itchat实现微信聊天机器人,定时发送微信消息,消息防撤回,消息监控,自定义回复消息
  20. 【输入法】 关于win自带的输入法不能打出中文标点

热门文章

  1. 光滑噪声数据常用的方法_如何处理噪声数据
  2. CAD中用多重插入块加密的图纸怎么分解?
  3. Oracle EBS R12 AP应付模块 查询发票付款信息SQL
  4. NeurIPS 2022 | 最强斗地主AI!网易互娱AI Lab提出基于完美信息蒸馏的方法
  5. 【C语言练习题】斐波那契
  6. springboot毕设项目大学生助学贷款管理系统w659v(java+VUE+Mybatis+Maven+Mysql)
  7. 计算机网络自顶向下方法 习题参考答案 第四章
  8. HTTP状态码大全(整理)
  9. Android Audio AudioHardwareALSA::openOutputStream函数
  10. ZZULIOJ 1170