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生成树状执行计划_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 闲聊MySQL(九):浅析SQL执行计划

    文章目录 前言 SQL执行计划 Explain输出字段 id select_type table partitions type possible_keys key key_len ref rows ...

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

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

最新文章

  1. A problem occurred starting process 'command '/home/jason/Android/Sdk/build-tools/23.0.3/aapt
  2. java连接电脑可以把整个文件下载到手机里然后直接用么,如果是山寨机支持java如何用电脑往手机上下载软件...
  3. contains方法_【原创】Pandas数据处理系列(二):常用处理方法笔记
  4. go为什么比php性能好,刚学 GO,撸了个支付宝发券的程序,为什么性能还比不上 PHP ?...
  5. 【熟能生巧】系列第2期 - 倒计时脚本
  6. Django路由控制
  7. 读论文看到的好的英文词句表达
  8. ESP8266获取B站粉丝数
  9. Android开发地图应用--坐标转换
  10. android 文件管理器 apk,Android6.0自带文件管理器无法打开apk文件
  11. 【小程序测试】小程序介绍,项目简介
  12. 闲云野鹤:吃鸡(四)之场景制作—用unity内置草功能制作草
  13. android fresco 圆角,圆角和圆圈
  14. vue搜索(不区分大小写)通用
  15. BUUNCTF Hack World
  16. 【架构】大数据风控数据系统架构
  17. 什么是lora无线通讯
  18. Java面试题中高级,nasdocker有啥好玩的
  19. 用vb脚本语言找出c盘所有文件及其子文件中后缀名为.txt的文档,2012年3月计算机二级VB练习题及答案:文件...
  20. MySQL提示:The server quit without updating PID file问题的解决办法

热门文章

  1. 【嵌入式模块】再探ESP8266,保姆级教程
  2. Linux系统tomcat修改端口
  3. gsp计算机系统系统操作培训,gsp计算机系统操作
  4. java实现中文大写金额转小写数字
  5. 使用spring data JPA进行类目增删改查测试
  6. 微信朋友圈服务器缓存,怎么删微信朋友圈缓存?
  7. 【牛客网-公司真题-前端入门篇】——如何快速上手牛客
  8. NLP文本情感——SNOWNLP简易版
  9. 明解C语言【中级篇】
  10. Java应用在docker环境配置容器健康检查