志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。

  • 优美的音乐节奏带你浏览这个效果的编码过程
  • 坚持每一天,是每个有理想青年的追求
  • 追寻年轻人的脚步,也许你的答案就在这里
  • 如果你迷茫 不妨来瞅瞅这里

1 前言

如下我这里有两张表,表t1为某活动的报名信息表,部分建表 DDL 如下:

CREATE TABLE `t1` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`activity_id` bigint(20) DEFAULT '0' COMMENT '关联的活动信息',`user_id` bigint(20) DEFAULT '0' COMMENT '报名人的ID',`create_time` datetime DEFAULT NULL COMMENT '报名时间',`remark` varchar(255) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18  COMMENT='活动报名表';

表t2为 投票信息表,也就是说 t2表中保存的是给t1表中的报名用户投票记录信息,部分建表 DDL 如下:


CREATE TABLE `t2` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`activity_user_id` bigint(20) DEFAULT '0' COMMENT '关联的活动报名信息 t1表中的id',`vote_user_id` bigint(20) DEFAULT '0' COMMENT '投票者的信息',`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `activity_user_id`(`activity_user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=226 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户投票记录表';

现在 我 t1 表中有 10 条数据

t2表中 84 条数据,如图所示

现在有一需求就是查询 户的投票记录以及报名信息,那么我们需要从 t1表中获取报名信息,然后再从t2表中获取每个用户的投票记录。

那么无非就是有两种查询思维,一种是先取t1,再循环取t2,另一种是使用 join ,那到底使用哪种,你是怎么决定的呢???

1 我们先来看看 循环查询

在不使用join的情况下,我们需要先从t1表中查出这用户的报名信息,然后循环从t2表中查询投票信息,这个过程如下


  • 执行select * from t1 ,每一行数据记为 C,这一步会对t1表进行全表扫描,我们t1表中是10条数据,全表扫描10行

type = ALL,全表扫描,MYSQL扫描全表来找到匹配的行

  • 然后循环遍历这 10 行数据,从每一行 数据 C 中取出字段 id 的值; 执行select * from t2 where activity_user_id=id;(activity_user_id走的是索引树搜索) 把返回的结果和 C 构成结果集的一行。

在表t2中,满足 t1表中id为12的有49条数据

这个过程中 扫描 49行数据

type = ref ,使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。

满足 id 为13的有 35条数


这个过程中扫描35行数据

然后 t1 表中其他 8条数据在表 t2中没有记录,所以查询过程中各扫描一行。

在这个过程中,这样查询下来,需要在业务代码中自己组装循环查询,t1表扫描 10行,t2表扫描 35 + 49 + 8 = 92,查询完成总共扫描 102行数据。


2 使用 join 时

当使用 join 时,可以这样写 :(使用 STRAIGHT_JOIN 保证固定联表顺序)

SELECT*
FROMt1  STRAIGHT_JOIN  t2 ON (t1.id = t2.activity_user_id )

满足条件的有 84 条数据

这个语句的执行流程是这样的:

  • 第一步 从表 t1 中读入一行数据 C;
  • 第二步从数据行 C 中,取出 id 字段到表 t2 的 activity_user_id 索引树中搜索;
  • 第三步 取出表 t2 中满足条件的行,跟 C 组成一行,作为结果集的一部分;
  • 第四步 重复执行步骤 1 到 3,直到表 t1 的末尾循环结束。

这个过程是先遍历表 t1,然后根据从表 t1 中取出的每行数据中的 id 值,去表 t2 中查找满 足条件的记录,这个过程称为 “Index Nested-Loop Join”,简称 NLJ。

在这个过种中,t1表是驱动表,是走全表扫描,t2是被驱动表,是走树搜索,所以在 join过程中,应该让小表作驱动表。

此时 我们将 t2表中的 activity_user_id 索引删除


我们再查询一下


我们可以清楚的看到当不走索引搜索时,t1与t2都走了全表扫描,

执行过程如下

  • 第一步扫描表 t1,顺序读取数据行放入 join_buffer 中,假设放完第 3 行 join_buffer 满了,继续 第二步操作;
  • 第二步 扫描表 t2,把 t2 中的每一行取出来,跟 join_buffer 中的数据做对比,满足 join 条件的,作为结果集的一部分返回;
  • 第三步 清空 join_buffer;
  • 第四步 继续扫描表 t1,顺序读取最后的 7 行数据放入 join_buffer 中,继续执行第 二 步。

这时候由于表 t1 被分成了两次放入 join_buffer 中,导致表 t2 会被扫描两次,这个过程就是 “Block Nested-Loop Join”。

显然 这两种情况 “Index Nested-Loop Join” 与 “Block Nested-Loop Join” 分析得出,如果可以使用到被驱动表中的索引,就可以使用 join 来查询。

如果无法使用到被驱动表的索引查询,这样可能要扫描被驱动表很多次,会占用大量的系统资源,所以这种情况下 join 尽量不要用。


完毕

不局限于思维,不局限语言限制,才是编程的最高境界。

以小编的性格,肯定是要录制一套视频的,随后会上传

有兴趣 你可以关注一下 西瓜视频 — 早起的年轻人

MySql 你知道什么情况下适合使用Join 联表查询吗 ?相关推荐

  1. mysql不用left join_MySQL在右表数据不唯一的情况下使用left join的方法_MySQL - join

    一.Join语法概述join 用于多表中字段之间的联系,语法如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditionatable1:左表 ...

  2. 管理QQ群,什么情况下适合用软件

    管理QQ群,什么情况下适合用软件? 不需要人工干预也能实现目的的时候.比如不求质量单求数量,用软件疯狂的做. 比如qq群群发引流到空间日志. 这个工作,用软件发就挺好的,跟雇威客们发,效果一样. 但如 ...

  3. Mysql删除数据什么情况下会释放空间

    Mysql删除数据什么情况下会释放空间 删除数据几种情况以及是否释放磁盘空间 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM 2.truncat ...

  4. 如何在不知道密码的情况下解除excel的工作表中的保护

    如何在不知道密码的情况下解除excel的工作表中的保护 在工作过程中经常会遇到打开一个受保护的excel文件,不知道密码只能查看不能进行编辑,那如何在不知道密码的情况下解除excel工作表的保护呢?下 ...

  5. (转)MySQL联表查询

    资料源于网络 一.内联结.外联结.左联结.右联结的含义及区别 在SQL标准中规划的(Join)联结大致分为下面四种: 1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. ...

  6. mysql带账号联查表_MySQL联表查询的简单示例

    MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度.下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 关系型 ...

  7. 《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别

    MySQL基础知识大全 1.操作数据库 1.1 创建表 1.2 修改表名 1.3 增加表的字段 1.4 修改表的字段 1.4.1 修改表的字段 1.4.2 修改表名 1.5 删除表的字段 1.6 删除 ...

  8. 快速回顾 MySQL:联表查询

    前提要述:参考书籍<MySQL必知必会> 文章目录 12.1 联结 12.1.1 关系表 12.1.2 联结的作用 12.1.3 创建联结 12.1.4 WHERE子句的重要性 12.1. ...

  9. mysql左驱动表_MySQL多表联表查询驱动表选择

    联表查询做开发的小伙伴会经常使用,但是可以大家都比较少去深入了解MySQL是怎么执行多表联表查询的,比如怎么选择驱动表(第一个被处理的表),是先联表还是说先根据where条件(前提是有where条件) ...

最新文章

  1. Script:GridControl Repository Health Check
  2. 一直以为Python没有自带四舍五入的函数
  3. 使用Reactor进行反应式编程最全教程
  4. 【01】《正则表达式必知必会》(已看)(仅存放)
  5. 08.QT中sqlite3数据库基本操作
  6. oracle 模糊查询_MySQL Like模糊查询速度太慢如何解决
  7. (四)怎么优化 where 子句
  8. C语言基础课第三次作业
  9. 用word写接口文档时的常规格式设置
  10. unserialize():Error at offset 0 of 96 bytes是什么意思
  11. debian中直接使用yed.jar
  12. PLC实验 S7-300超详细硬件组态实验过程
  13. 多线程,io,网编,反射,xml
  14. 编写一个程序,计算学生的总分和平均成绩(一)
  15. MySQL字段约束条件,外键约束条件,表关系
  16. 异地IT驻场外包人员如何管理?
  17. 第一次找工作/实习前需要准备的东西(互联网行业)
  18. arduino 土壤温湿度传感器_Arduino 与 土壤湿度传感器 测量土壤湿度自动浇水提醒...
  19. 计算机组成原理 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?...
  20. 北大扫地僧“火”了!手提馒头矿泉水的他,是博士毕业1年就成北大助理教授的90后!...

热门文章

  1. 改变多目标跟踪领域!CMU等推出大规模多类别MOT数据集TAO
  2. 重磅!DataFountain新上两项CV算法竞赛-32万巨奖等你来拿!
  3. vue中this.init用法_Vue中的this.$options.data()和this.$data用法说明
  4. 【Python】Python实战从入门到精通之六 -- 教你读取文件
  5. 短板决定高度 | 人工智能的数学基础
  6. 机器学习面试之偏差方差
  7. 基础知识(一)matlab与c++混合编程之环境搭建
  8. 自动点击屏幕脚本代码_原来这么简单,一分钟学会引流脚本
  9. php远程读取几行文件,PHP读取远程文件的三种方法
  10. 值得收藏的信息安全知名博客