mysql join底层实现

2023-11-05

两个表join底层实现:

5.5 版本之前,MySQL本身只支持一种表间关联方式,就是嵌套循环(Nested Loop Join)。如果关联表的数据量很大,则join关联的执行时间会非常长。在5.5以后的版本中,MySQL通过引入BNLJ算法来优化嵌套执行。

mysql底层join实现只支持一种算法:嵌套循环连接(Nested-Loop Join),nested-Loop-Join有三种变种:

Simple Nested-Loop Join 简单嵌套循环连接

Index Nested-Loop Join 索引嵌套循环连接

Block Nested-Loop Join  块索引嵌套连接

1.Simple Nested-Loop Join:

如图,A为驱动表,B为匹配表。 从A中取出数据1,遍历B,将匹配到的数据放到result.. 以此类推,每条A表数据都会轮询B表。

2.Index Nested-Loop Join(索引嵌套):

这个需要查询时,关联非驱动表(也就是匹配表)的索引,通过索引来减少比较,加速查询。

在查询时驱动表会根据关联字段的索引 到非驱动表查找数据,找到对应的值,此时分为两种情况:

如果索引不是主键索引的话,需要进行回表查询(根据索引携带的主键信息查询数据) 不是主键时,要进行多次回表查询,先关联索引,再根据主键ID查询,性能上要慢很多。

如果关联字段是非驱动表的主键时,性能会非常高,直接就能定位到数据。

这里不懂的可以看下我的这个博客中的Inoodb引擎下的索引与主键存储图:

https://blog.csdn.net/qq_37113604/article/details/88831254

3.Block Nested-Loop Join(块嵌套):

如果关联的是非驱动表的索引会走索引嵌套,但如果join的列不是索引,就会采用Block Nested-Loop Join。  首先将驱动表的结果集中 所有与join相关的列都先缓存到join buffer中(这样当查找完成时,就可以将匹配到的记录从内存与非驱动表放到result返回),然后批量与匹配表进行匹配,将第一种中的多次比较合并为一次,降低了非驱动表的访问频率。 默认情况下join_buffer_size=256K(可以通过show variables like 'join_%' 查看大小)。

BNL 算法:将外层循环的行/结果集存入join buffer, 内层循环的每一行与整个buffer中的记录做比较,从而减少内层循环的次数.
举例来说,外层循环的结果集是100行,使用NLJ 算法需要扫描内部表100次,如果使用BNL算法,先把对Outer Loop表(外部表)每次读取的10行记录放到join buffer,然后在InnerLoop表(内部表)中直接匹配这10行数据,内存循环就可以一次与这10行进行比较, 这样只需要比较10次,对内部表的扫描减少了9/10。所以BNL算法就能够显著减少内层循环表扫描的次数.

 

 

当有两个表以上join时:

两个表以上join时也会用到join buffer,会将前两个表的结果集缓存下来,然后与第三个表比较,再返回result。建议把join buffer开大点,因为当join buffer不够用时会对数据进行分段(例如将后一千条数据放入硬盘)将内存存不下的数据放入硬盘,这样读写会产生IO从而减缓速度。

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql join底层实现 的相关文章

随机推荐

  • Linux 操作系统管理命令(全)

    目录 1 Linux常用命令 1 date 2 pwd命令 3 cd命令 4 cal命令 5 who命令 6 wc命令 7 uname命令 8 clear命令 9 logout命令 10 shutdown命令 2 命令高级操作 1 命令补全
  • VQ-VAE-2

    原文链接 Generating Diverse High Fidelity Images with VQ VAE 2 加载速度慢点这里 中科院镜像 由于科研需要 最近在学习图像生成相关的文献知识 VQ VAE 2是我目前了解到的比较新的生成
  • PMD检查java代码:为了提升性能,正确使用记录日志的语句(GuardLogStatement)

    https docs pmd code org pmd doc 6 55 0 pmd rules java bestpractices html guardlogstatement 对应记录日志的语句 要首先检查对应的日志级别有没有实际打开
  • Windows下VS2015编译caffe(CPU ONLY)

    本文参照了 Windows下VS2015编译caffe 零基础 1 环境 Windows 7VS2015 CPU ONLY 2 准备工作 原文说 https github com BVLC caffe tree windows Requir
  • linux验证cuda安装成功_CUDA9.1在Linux系统下runfile方式安装手册

    一 准备工作 确认是CUDA9 1 支持的Linux系统版本 3 确认gcc已安装 输入gcc version命令 如果有报错信息 需要重新安装gcc 4 确认安装了正确版本的kernel devel和kernel headers unam
  • 利用三轴加速度求解位移的算法—来自飞思卡尔方案

    在要求精度不高的情况 可以使用三轴加速度积分得到位移 飞思卡尔给出了官方方法 下文来自翻译说明 cache freescale com files senso 摘要 此文档描述并使用MMA7260QT三轴加速计和低功耗的9S08QG8八位单
  • Qt在connect中使用lambda表达式(最简单)

    若想在QT中使用lambda表达式需要在项目文件中的 pro 中加入 CONFIG c 11 例子 当点击按钮时 打印一个 输出 需要包含按钮类和打印调试类 include
  • ROS-Qt-转CMake编译以及qmake第三方库添加及其他

    Qt 开发ROS 界面的方法 方法2 带ui的工作空间配置 以ROS节点执行 步骤1 mkdir catkin qt cd catkin qt mkdir src cd src catkin init workpasce cd catkin
  • volatile足以保证数据同步吗

    在讨论之前必须先搞清四种存储介质 寄存器 高级缓存 RAM和ROM RAM与ROM大家都比较熟悉了 可以看成是我们经常说的内存与硬盘 寄存器属于处理器里面的一部分 而高级缓存cache是CPU设计者为提高性能引入的一个缓存 也可以说是属于处
  • axios post方式同时传递pram和json参数

    废话不多说 直接上代码 1 单独传递表单参数 后台使用 RequestParam接收 let postData mobile this account password this password loginType 0 let postD
  • 编译原理------语法分析器C/C++代码实现

    一 实验目的 编制一个递归下降分析程序 实现对词法分析程序所提供的单词序列的语法检查和结构分析 二 实验内容 利用C语言编制递归下降分析程序 并对简单语言进行语法分析 2 1 待分析的简单语言的语法 用扩充的BNF表示如下 lt 程序 gt
  • npm nrm安装后报错

    错误信息为 C Users Lenovo AppData Roaming npm node modules nrm cli js 9 const open require open Error ERR REQUIRE ESM require
  • Hadoop学习笔记(六)(Spark + Flink + Beam)

    spark 计算框架 速度 易用 通用性 Mapreduce是进程级别的 Spark是线程级别的 Spark生态系统 DBAS Berkeley Data Analytics Stack Mesos HDFS Tachyon 基于内存的文件
  • LRUCache详解

    1 概念 LRU是Least Recently Used的缩写 意思是最近最少使用 它是一种Cache替换算法 Cache的容量有限 因此当Cache的容量用完后 而又有新的内容需要添加进来时 就需要挑选并舍弃原有的部分内容 从而腾出空间来
  • 【C++类模板详解】——快速入门C++风靡全球的原因

    C 类模板详解 快速入门C 风靡全球的原因 C 是目前全球最为流行 应用范围最为广泛的编程语言之一 其强大的语言特性和灵活的代码设计方式使得它被广泛应用于各种领域 包括操作系统 数据库 游戏 框架等等 而在C 中 类模板是一种非常重要的编程
  • Unity中如何让物体和相机一起动

    Unity中开发VR或者AR应用中我们想要物体和相机跟随着进行移动 我们需要先获得相机的参数 其次我们需要修改物体的参数使得其跟随移动 public class TestCubeStability MonoBehaviour public
  • javascript 优雅实现时间格式化

    有的时候 我们需要一定格式的 时间 比如 2017 05 12 08 48 这样的格式 上代码先 时间格式化 第一种 function formatDate time var date new Date time var year date
  • 在 Silverlight 中管理动态内容交付,第 1 部分

    本文示例源代码或素材下载 目录 Silverlight 应用程序的大小 动态生成的 XAML 动态生成的 XAP 请求内容 缓存下载的内容 下载工具 下载仅含 XAML 的数据 使用 XAP 程序包 处理 XAP 内容 总结 任何使用富 I
  • 双向可控硅控制220v通断电路_什么是双向可控硅,它在交流调压电路中有哪些应用...

    一 导读 目前交流调压多采用双向可控硅 它具有体积小 重量轻 效率高和使用方便等优点 对提高生产效率和降低成本等都有显著效果 但它也具有过载和抗干扰能力差 且在控制大电感负载时会干扰电网和自干扰等缺点 下面来谈谈可控硅在其使用中如何避免上述
  • mysql join底层实现

    两个表join底层实现 5 5 版本之前 MySQL本身只支持一种表间关联方式 就是嵌套循环 Nested Loop Join 如果关联表的数据量很大 则join关联的执行时间会非常长 在5 5以后的版本中 MySQL通过引入BNLJ算法来