当前位置: 首页 > news >正文

mysql join的原理及过程

连接过程

每获得一条驱动表记录,就立即到被驱动表寻找匹配的记录。

对于两表连接来说,驱动表只会被访问一遍,但被驱动表却要被访问好多遍;具体访问几遍取决于对驱动表执行单表查询后的结果集中有多少条记录。

​ 对于内连接来说,选取哪个表为驱动表都没关系。

​ 而外连接的驱动表是固定的,也就是说左(外)连接的驱动表就是左边的那个表,右(外)连接的驱动表就是右边的那个表。

连接原理

嵌套循环连接
连接步骤:

​ 步骤1 :选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询.

​ 步骤2:对步骤 1中查询驱动表得到的结果集中的每一条记录,都分别到被驱动表中查找匹配的记录(先通过“涉及两表的过滤条件”匹配,再进行“只涉及被驱动表的过滤条件”进行过滤)。

​ 由于被驱动表可能会访问多次,因此可以为被驱动表建立合适的索引以加快查询速度。

​ 如果驱动表非常大,则可能会多次访问被驱动表,就会导致很多次的磁盘I/O,此时可以使用基于块的嵌套循环连接算法来缓解由此造成的性能损耗。

优化:基于块的嵌套循环连续

join Buffer (连接缓冲区〉

​ Join Buffer 就是在执行连接查询前申请的一块固定大小的内存。先把若干条驱动表结果集中的记录装在这个 Join Buffer 中,然后开始扫描被驱动表,每条被驱动表的记录一次性地与 Join Buffer 中的多条驱动表记录进行匹配。由于匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的I/O代价.

​ 最好的情况是 Join Buffer 够大 能容纳驱动表结果集中的所有记录,这样只需要访问一次被驱动表就可以完成连接操作了。

​ 由join buffe _size配置。

http://www.lryc.cn/news/573666.html

相关文章:

  • C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。
  • 【递归,搜索与回溯算法】记忆化搜索(二)
  • 如何处理RocketMQ的各种线上问题
  • 【Python学习笔记】报错:Unindent amount does not match previous indent
  • Spring Boot 项目初始化
  • AWS 使用图形化界面创建 EKS 集群(零基础教程)
  • LabVIEW图像拼接原理与实现 链接附件有演示录像
  • 如何用AI开发完整的小程序<9>—UI自适应与游戏页优化
  • 关于uniapp解析SSE响应数据的处理
  • 【学习笔记】深入理解Java虚拟机学习笔记——第11章 后端编译与优化
  • 关于CH32开发板烧录说明
  • 用可观测工具高效定位和查找设计中深度隐藏的bug
  • webpack+vite前端构建工具 -6从loader本质看各种语言处理 7webpack处理html
  • Linux内核中安全创建套接字:为何inet_create未导出及正确替代方案
  • SAP金属行业解决方案:无锡哲讯科技助力企业数字化转型与高效运营
  • Kafka Streams架构深度解析:从并行处理到容错机制的全链路实践
  • 针对数据仓库方向的大数据算法工程师面试经验总结
  • netcore url编码/解码
  • [计算机网络] 局域网内的网络传输
  • SpringBoot+Vue服装商城系统 附带详细运行指导视频
  • 3dgs涉及的基本概念:球谐系数(SH 系数)等
  • Python之数据容器
  • 【JavaScript】代码整理
  • vim学习流程,以及快捷键总结
  • Python 深度学习基础:TensorFlow 入门——从张量到神经网络的实战指南
  • 【2025年软考中级】第三章数据结构3.4 数组与矩阵
  • Flink作业三种部署模式:架构、配置与实战应用
  • rknn优化教程(三)
  • Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)
  • 【云原生】Docker 部署 Elasticsearch 9 操作详解