Mysql 学习(九)多表连接原理

news2025/1/12 4:09:21

连接介绍

  • 为了更加方便的介绍一下连接,我们先创建两个表格 t1 和 t2
CREATE TABLE t1 (m1 int, n1 char(1));

CREATE TABLE t2 (m2 int, n2 char(1));

INSERT INTO t1 VALUES(1, 'a'), (2, 'b'), (3, 'c');

INSERT INTO t2 VALUES(2, 'b'), (3, 'c'), (4, 'd');
  • 连接的本质是将各个需要连接的表中的记录拿出来,再根据某一个规则进行匹配组合加入结果集并返回
    在这里插入图片描述
  • 连接查询的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合,像这样的结果集就可以称之为笛卡尔积。因为表t1中有3条记录,表t2中也有3条记录,所以这两个表连接之后的笛卡尔积就有3×3=9行记录。
  • 我们可以连接很多个表,但是这样的话连接以后的数据量就会很大,查询的时候也会很消耗性能,所以在连接时候也需要加上一些查询条件,而过滤查询条件的形式可以分为两种:
    • 涉及单表的条件
    • 设计多表的条件
      • 举个例子:SELECT * FROM t1, t2 WHERE t1.m1 > 1 AND t1.m1 = t2.m2 AND t2.n2 < 'd';
      • 查询过程:
        • 确定第一个需要查询的表,这个表称之为驱动表。
          在这里插入图片描述

        • 针对上一步骤中从驱动表产生的结果集中的每一条记录,分别需要到t2表中查找匹配的记录,所谓匹配的记录,指的是符合过滤条件的记录。
          在这里插入图片描述

连接原理

  • 上面只是介绍连接,这里我们就需要了解一下连接的一些原理,了解为什么有些连接查询很快,有些会很慢?
  • 我们需要了解一个概念,就是嵌套循环连接算法,将这个概念之前,先说一个上面的例子:SELECT * FROM t1, t2 WHERE t1.m1 > 1 AND t1.m1 = t2.m2 AND t2.n2 < 'd'
    • 对于两表 t1 和 t2 连接的话,第一个需要查询的表,这个表称之为驱动表,而后面那个需要匹配的表就称之为被驱动表。
    • t1 和 t2 的连接过程:
      • 选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询。
      • 对上一步骤中查询驱动表得到的结果集中每一条记录,都分别到被驱动表中查找匹配的记录。
    • 了解完这个连接过程之后,我们想想,如果有第三个表的话,怎么办?答案是把前面两张表的结果集当作驱动表,第三张表当作被驱动表,重复上面的操作,这种过程像是一个嵌套的循环
    • 所以我们把这种驱动表只访问一次,但被驱动表却可能被多次访问,访问次数取决于对驱动表执行单表查询后的结果集中的记录条数的连接执行方式称之为嵌套循环连接

使用索引加快连接速度

  • 了解完嵌套循环连接之后,我们需要思考,怎么样才能使得连接加快?
  • 回答这个问题的时候我们还是要回到上面那个例子:SELECT * FROM t1, t2 WHERE t1.m1 > 1 AND t1.m1 = t2.m2 AND t2.n2 < 'd'
  • 再来看一下过程:
    • 从t1 查询到两条记录 2 b 和 3 c
    • 嵌套循环连接需要根据这两条记录,去t2 里面查询两次
      • 当t1.m1 = 2时,去查询一遍t2表,SELECT * FROM t2 WHERE t2.m2 = 2 AND t2.n2 < 'd';
      • 当t1.m1 = 3时,再去查询一遍t2表,SELECT * FROM t2 WHERE t2.m2 = 3 AND t2.n2 < 'd';
  • 看到这个过程有没有什么想法,是不是再查找t2表的时候可以通过索引去查找,也就是说我们可以通过索引去加快 t2 表的查找
  • 方案如下:
    • 方案一:在m2列上建立索引,因为对m2列的条件是等值查找
    • 方案二:在n2列上建立索引,涉及到的条件是t2.n2 < ‘d’,可能用到range的访问方法,假设使用range的访问方法对t2表的查询的话,需要回表之后再判断在m2列上的条件是否成立。
  • 如果 m2 和 n2都有索引的话,会择优一个消耗小的查询,并且只有在二级索引 + 回表的代价比全表扫描的代价更低时才会使用索引

基于块的嵌套循环连接

  • 除了索引之外我们可以想想一些有关硬件方面的优化
  • 讲个场景,上面的例子 t1 和 t2 只有3条,但是正常工作中肯定不止3条,成千上万条,并且我们做匹配的时候,都是把数据加载到内存中,所以在扫描表前面记录的时候后边的记录可能还在磁盘上,等扫描到后边记录的时候可能内存不足,所以需要把前面的记录从内存中释放掉。采用嵌套循环连接算法的两表连接过程中,被驱动表可是要被访问好多次的,如果这个被驱动表中的数据特别多而且不能使用索引进行访问,那就相当于要从磁盘上读好几次这个表,这个I/O代价就非常大了,所以我们得想办法:尽量减少访问被驱动表的次数。
  • 为了解决这个问题,我们最好的方法是我们一次性把被驱动表和多条驱动表的数据匹配好然后再拉出来。
  • 为了实现这个方法,mysql的设计提出了一个join buffer的概念,join buffer 顾名思义 连接缓存,执行连接查询前申请的一块固定大小的内存,先把若干条驱动表结果集中的记录装在这个join buffer中,然后开始扫描被驱动表,每一条被驱动表的记录一次性和join buffer中的多条驱动表记录做匹配,因为匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的I/O代价。
    在这里插入图片描述
  • 这个join buffer的大小是可以通过启动参数或者系统变量join_buffer_size进行配置,默认大小为262144字节(也就是256KB),最小可以设置为128字节

总结

  • 连接的实现是通过嵌套循环连接算法
  • 嵌套循环连接算法的实现方式是:对于连接操作中的两个表,先将其中一个表作为外层循环,另一个表作为内层循环,依次遍历外层表和内层表的所有行,将符合连接条件的行组合起来。具体来说,对于每一行在外层表中找到对应的行,在内层表中找到符合连接条件的行,然后将两行合并成一行作为查询结果。由于需要对每行进行遍历,因此嵌套循环连接算法的时间复杂度为 O(mn),其中 m 和 n 分别为两个表的行数。
  • 优化连接查询:
    • 使用索引
    • 使用子查询:使用子查询可以将外连接拆分为两个单独的查询,这可以减少查询中的数据量,从而提高查询性能。例如,可以首先从一个表中选择所需的记录,然后再与另一个表进行连接。
    • 增加硬件资源:增加 MySQL 服务器的硬件资源,例如 CPU、内存和磁盘空间,可以提高查询性能。如果查询负载很高,可以使用主从复制和分区技术来分散查询负载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub上的AutoGPT神秘的面纱

最近一直在说AutoGPT&#xff0c;有很多的视频介绍&#xff0c;但是本着收藏等于学会的原则&#xff0c;收藏一堆一直没看。 这里用一句话说明白&#xff1a;AutoGPT就是一个用Python套装的壳子&#xff0c;用来更省事的调用OpenAI的API。&#xff08;如果你不明白API&#xf…

WiFi(Wireless Fidelity)基础(二)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

ByteBuffer的讲解和使用

1.它其实就是一个数据读取或者写入的一个缓冲区 2.基本的操作步骤&#xff1a; 向buffer写入数据&#xff0c;例如调用channel.read(buffer)调用flip()切换至读模式从buffer读取数据&#xff0c;例如调用buffer.get()调用clear()或者compact()切换至写模式重复以上步骤 3.内部…

企业商务租车为工作提供便利

在当代的忙碌生活中&#xff0c;我们总会遇到各种各样的烦恼。最突出的是企业在商务工作中&#xff0c;常常会因为各种原因而导致耽误时间&#xff0c;如火急火燎的去谈生意&#xff0c;却遇到了堵车的现象&#xff0c;或者车辆出现问题而导致耽误时间&#xff0c;而广州商务租…

ICV:中国车载超声波雷达市场规模预计2024年可达20亿美元

近年来&#xff0c;由于市场对车辆先进安全功能的需求的增加&#xff0c;汽车超声波传感器市场一直保持稳步增长。ICV估计&#xff0c;车载超声波传感器全球市场预计在2022年至2027年之间以11.5&#xff05;的复合年增长率增长&#xff0c;这种增长是由越来越多的高级驾驶辅助系…

python 开发 1 之 拷贝文件

目录 一、需求&#xff1a; 二、python拷贝分析 1、需要的库&#xff0c;及源路径、目标路径定义 2、定义的拷贝数组 3、自定义拷贝函数 1&#xff09; 如果目标路径不存在时&#xff0c;先创建目标路径 2&#xff09;遍历元组数组中的文件 3&#xff09;如果源文件或目…

【JavaEE初阶】多线程进阶(六)JUC 线程安全的集合类

文章目录 JUC&#xff08;java.util.concurrent&#xff09;的常见类Callable接口相关面试题 ReentrantLock(可重入锁)原子类信号量SemaphoreCountDownLatch 线程安全的集合类多线程环境使用 ArrayList多线程使用队列多线程使用哈希表&#xff08;重点&#xff09;相关面试题 J…

2.sql server数据表的管理(实验报告)

目录 一﹑实验目的 二﹑实验平台 三﹑实验内容和步骤 四﹑命令(代码)清单 五﹑运行结果 一﹑实验目的 掌握使用SQL Server管理平台和Transact-SQL语句Create table和Alter table创建和修改表的方法&#xff1b;掌握在SQL Server管理平台中对表进行插入、修改和删除数据操作…

哪种蓝牙耳机戴着最舒服?久戴不痛的蓝牙耳机推荐

很多喜欢跑步或通勤的时候带着耳机听音乐&#xff0c;而现在无线耳机市场规模扩大之后&#xff0c;也开始走向更加细分的市场&#xff0c;以满足越来越不同的差异化需求&#xff0c;但是佩戴的舒适度是很多人关注的&#xff0c;下面整理了几款佩戴舒适度高的蓝牙耳机&#xff0…

国考省考结构化面试:组织管理题,调研题,宣传题,活动题,整治题

国考省考结构化面试&#xff1a;组织管理题&#xff0c;调研题&#xff0c;宣传题&#xff0c;活动题&#xff0c;整治题 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测…

基于python语言dlib库和opencv库的视频眨眼检测

功能说明&#xff1a; 基于python编程语言&#xff0c;使用dlib 和opencv开发的视频眨眼检测。 环境&#xff1a; * python 3.6.8 * opencv 3.4.2.16 * dlib 19.7.0 原理&#xff1a; 1.使用opencv-python读取处理视频图像 2.使用线程机制处理人脸检测关键点 3.根…

Midjourney 5.1震撼更新!逼真到给跪,中国情侣细节惊艳,3D视频大片马上来

来源 | 新智元 作者 | 桃子&#xff0c;拉燕 一个月前&#xff0c;Midjourney V5画的一对中国完美情侣在网上爆火&#xff0c;让许多人纷纷惊呼画师要失业了。 恰在今天&#xff0c;Midjourney官宣V5能免费用了&#xff0c;而且还是最新版本V5.1。 各个大模型的研究测试传送门 …

Android 13 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 33。 影响Android 13上所有应用 1.通知受限 对新安装的应用的影响&#xff1a; 如果用户在搭载 Android 13 或更高版本的设备上安装您的应用&#xff0c;应用的通知默认处于关闭状态。在您请求新的…

ChatGPT如何生成可视化图表-示例中国近几年出生人口

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 ChatGPT本身不能直接生成可视化图表&#xff0c;但可以配合其他可视化工具或库 方法一&#xff1a;前端可视化开发库 Echarts&#xff08;地址&#xff1a;Apache ECharts &#xff09; 方法二&#xff1a;现有Python库。…

dump_stack分析函数调用关系实例及其实现

dump_stack分析函数调用关系 文章目录 dump_stack分析函数调用关系一、dump_stack实例二、dump_stack实现分析Step 1: dump_stack_print_infoStep 2: show_stack 三、关于堆栈 一、dump_stack实例 在正点原子阿尔法开发板中查看insmod命令使用什么方法&#xff1a; #include …

[蓝帽杯 2022 初赛]之Misc篇(NSSCTF)刷题记录(复现)⑨

NSSCTF-Misc篇-[蓝帽杯 2022 初赛] 计算机取证&#xff1a;[蓝帽杯 2022 初赛]计算机取证_1[蓝帽杯 2022 初赛]计算机取证_2[蓝帽杯 2022 初赛]计算机取证_3[蓝帽杯 2022 初赛]计算机取证_4 手机取证&#xff1a;[蓝帽杯 2022 初赛]手机取证_1[蓝帽杯 2022 初赛]手机取证_2 网站…

使用堆视图创建3个按钮三角摆放

使用堆视图创建3个按钮三角摆放 效果如图&#xff1a; 分析 从效果图看&#xff0c;想要让3个Button呈三角摆放&#xff0c;需要两个堆视图完成。 首先外部一个大的“垂直堆”&#xff0c;垂直堆第一项放一个Button&#xff0c;第二项放一个“水平堆” 水平堆里再放两个But…

刚入职领导就要求做自动化测试?我懵了,从业务到框架设计总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

深度学习的环境搭建(window+pytorch)

1.检查是否安装CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由 NVIDIA 推出的一种并行计算平台和编程模型&#xff0c;用于利用 NVIDIA GPU&#xff08;Graphics Processing Unit&#xff09;的强大计算能力进行高性能计算任务。CUDA 的主要特点是…

logstash介绍和使用-ELK文章2

官方 Logstash 是免费且开放的服务器端数据处理管道&#xff0c;能够从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的“存储库”中。 下载和文档&#xff1a;https://www.elastic.co/cn/logstash/ docker部署&#xff1a;https://hub.docker.…