mysql笛卡尔积效率_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:
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执行计划与笛卡尔积相关推荐
- mysql 笛卡尔积影响_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...
- mysql生成树状执行计划_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...
- mysql 执行计划extra_SQL优化 MySQL版 -分析explain SQL执行计划与Extra
Extra 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:此文章必须有一定的Mysql基础,或观看执行计划入门篇传送门: https://www.cnblogs.com/Sta ...
- mysql 单表查询 优化_SQL优化 MySQL版 - 单表优化及细节详讲
单表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...
- mysql 几阶b树_SQL优化 MySQL版 - B树索引进阶详讲(一)
SQL优化 MySQL版 - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 索引分类 单值索引 单的意思就是单列的值,比如说有一张数据库表,表内有三个字段,分别 ...
- MySQL(三)——SQL执行计划分析
目录 一.SQL执行计划概述 二.explain字段详解 1.id 2.select_type 3.possible_keys 4.key 5. key_len 6.ref 7.rows 8.Extr ...
- 开启Mysql慢查询来优化mysql
开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...
- Mysql基础(十六):explain命令SQL执行计划
目录 写在前面 1.通过explain命令得到的SQL执行计划(1) 2.通过explain命令得到的SQL执行计划(2) 3.通过explain命令得到的SQL执行计划(3) 4.通过explain ...
- 闲聊MySQL(九):浅析SQL执行计划
文章目录 前言 SQL执行计划 Explain输出字段 id select_type table partitions type possible_keys key key_len ref rows ...
- Mysql 慢查询 Sql执行计划 SQL每阶段的耗时
文章目录 前言 一.慢查询的相关参数 slow_query_log 是否开启了慢查询 开启慢查询 slow_query_log_file 指定慢查询日志的存储路径及文件 long_query_time ...
最新文章
- A problem occurred starting process 'command '/home/jason/Android/Sdk/build-tools/23.0.3/aapt
- java连接电脑可以把整个文件下载到手机里然后直接用么,如果是山寨机支持java如何用电脑往手机上下载软件...
- contains方法_【原创】Pandas数据处理系列(二):常用处理方法笔记
- go为什么比php性能好,刚学 GO,撸了个支付宝发券的程序,为什么性能还比不上 PHP ?...
- 【熟能生巧】系列第2期 - 倒计时脚本
- Django路由控制
- 读论文看到的好的英文词句表达
- ESP8266获取B站粉丝数
- Android开发地图应用--坐标转换
- android 文件管理器 apk,Android6.0自带文件管理器无法打开apk文件
- 【小程序测试】小程序介绍,项目简介
- 闲云野鹤:吃鸡(四)之场景制作—用unity内置草功能制作草
- android fresco 圆角,圆角和圆圈
- vue搜索(不区分大小写)通用
- BUUNCTF Hack World
- 【架构】大数据风控数据系统架构
- 什么是lora无线通讯
- Java面试题中高级,nasdocker有啥好玩的
- 用vb脚本语言找出c盘所有文件及其子文件中后缀名为.txt的文档,2012年3月计算机二级VB练习题及答案:文件...
- MySQL提示:The server quit without updating PID file问题的解决办法