细谈left join和join

news2024/10/12 4:32:43

csdntup

👏作者简介:大家好,我是爱发博客的嗯哼,爱好Java的小菜鸟
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
📝社区论坛:希望大家能加入社区共同进步
🧑‍💼个人博客:智慧笔记
📕系列专栏:

文章目录

  • 前言
  • MySQL整体架构
  • join和left join执行流程
    • 有一个表有索引
    • 两个表都有索引
    • 两表都没索引
  • join和left join区别
    • 为什么left join左表为驱动表
    • left join特殊情况
  • 结语

前言

相信大家都知道在MySQL中的join、left join和right join,在业务中,需要两表联查总会用到联合查询语句。但大家却有可能并不太了解他们底层是如何进行处理的,也就无法在业务量大的情况下,去优化这些sql语句。

本节我就为大家通过执行流程层面进行一些讲解,相信大家看完本篇文章对以后的优化处理也就不会毫无头绪了。

MySQL整体架构

如果大家对于MySQL架构一点都不了解,可以去看一下这篇MySQL基本架构

在了解一种技术之前,最主要的就是知道其底层架构。只有知道了底层架构,才能在后续的基础上更轻松的掌握整体。

在这里插入图片描述

MySQL主要分为两个层面,一个是Server层,即MySQL官方自己的核心层面。另一个就是存储引擎层,这个相当于一个插件,所有人都可以基于MySQL官方给的结构进行实现存储引擎。

而要谈论的核心就是存储引擎层。使用不同的存储引擎,优化的方式也就不一样。而我们要谈论的是当前官方默认的存储引擎—InnoDB存储引擎

这张就是innodb的缓冲池,而和join优化相关的缓冲就是最不起眼的那个—额外的缓冲池

相信大家都知道缓冲池的功能,这里就不再过多赘述了。

join和left join执行流程

在join类型语句执行时一般会有两个表,一个为驱动表,另一个为被驱动表。首先执行引擎会去磁盘找到驱动表第一行数据,再去磁盘找到跟第一行匹配的语句。直到找完驱动表对应的所有匹配数据。

大家或许有疑问了,驱动表有什么好处呢?

这就用到上面的缓冲池这个东西了,执行引擎会将驱动表取出来放入缓冲池中,在内存遍历一行行数据去磁盘匹配对应的被驱动表数据。内存的速度是磁盘的几百倍,这样的话会比两表都在磁盘遍历快上很多倍。

有一个表有索引

既然大家知道了join过程会使用缓冲池,那当一个表有索引的时候,应该选哪个表作为驱动表合适?

首先驱动表会被加载到内存遍历所有行,而被驱动表只能在磁盘遍历。假设驱动表有n条数据,被驱动表有m条数据。

如果索引表做驱动表。

对于驱动表来说,每行都要走一次,时间复杂度为N。

而被驱动表没有索引,也需要全表扫描,时间复杂度为N*M。

执行过程近似时间复杂度为N+N*M。

如果索引表做被驱动表

对于被驱动表来说,时间复杂度大概是logM,查询到主键回表又是logM,需要查询N次,总共时间复杂度为N*2 *logM。

因此执行过程近似时间复杂度是N+N*2 *logM。

所以索引表做被驱动表的话,会大大提升查询效率。

因此业务中,在join查询时出现慢查询情况,可以将被驱动表加上索引。

两个表都有索引

当两个表都有索引的时候,时间复杂度为N+N*2 *logM,N占主导地位。

因此选择表数据小的做驱动表

业务中,建议小表驱动大表。

两表都没索引

这时候你或许有疑问了,两表都没索引时间复杂度不都是遍历两张表全表吗?

当然是不同的,首先驱动表是在内存中遍历的,要比磁盘快。如果放入内存中的数据多一点,磁盘io次数就少了。性能不久提升了。

话是这样说的,但这里面有一个大坑。

先把结论放出来:

  • 如果此时两个小表。选择相对大的做驱动表。
  • 如果此时一个小表,一个大表。选择小表做驱动表。
  • 如果此时两个大表。选择相对小的做驱动表。

为什么这样做呢?

首先缓冲区是有大小限制的,并不是无限的。因此,放入过大的表就会放不下。所以尽量能放入能放下的表。

对于放不下的大表也有优化方法。

MySQL使用BNL算法,将大表分块放入缓冲区中,对于每块都对驱动表进行全表扫描。

join和left join区别

这时候你已经知道了join和left join的大致执行流程了。但你或许还不知道他俩区别到底在哪里。这里就来详细说说。

首先join时inner join的缩写,意思是找到两个表同时成立的数据。

而left join查找的结果除啦inner join的结果,还有左表剩余的结果,以及右表对应的null值。

一般来说left join语句左表是驱动表,而inner join语句是优化器选择驱动表。

为什么left join左表为驱动表

这里就和上面执行流程有关了。

大家回忆一下,驱动表是不是存储在内存当中。而left join结果是不是需要左表的所有数据。而右表返回的刚好是符合条件的数据。剩下的左表查询不到的直接返回null值,刚好结果集对应left join需要的结果。

如果left join将右表作为驱动表有什么后果呢?

首先右表遍历所有数据找到对应左表的符合条件数据作为结果集。然后再次去磁盘查找左表剩余的数据。

这时候效率显而易见的会变低,因此一般都会将左表作为驱动表。right join也同理。

left join特殊情况

当然,left join左表驱动不是一定存在的。

left join和inner join一样,在表中现根据on条件选出结果集。如果出现where语句的时候,where会对结果集进行筛除。这时候where就会将左表出现右表却没有匹配的数据都给筛除掉。

当出现where的时候,left join就跟inner join相同了,筛选出同时成立的数据行。此时left join就会转换为inner join,由优化器指定驱动表。

所以left join不一定左表一定是驱动表。


结语

每个人都有自己独特的才华和潜能,在这个广袤的世界上,你的存在是有意义的。无论你是谁,你的背景如何,你所处的环境怎样,只要你敢于跨出舒适区,付出努力,追求卓越,你就能够开创属于自己的辉煌。

我们下期见。

每一次努力都是一次进步,即使进展缓慢,也要坚持不懈。

往期文章推荐

  • JUC详解
  • 缓存穿透、缓存击穿和缓存雪崩
  • 消息中间件相关面试题
  • Java集合相关面试题
  • Java集合详解
  • 微服务相关面试题
  • redis相关面试题
  • 图解 Paxos 算法

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

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

相关文章

OpenCV 10(图像轮廓)

一、图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用。 轮廓的作用: - 用于图形分析 - 物体的识别和检测 注意点: - 为了检测的准确性,需要先对图像进行**二值化**或**Canny操作**。 - 画轮廓时会修改输入的图像…

【轻量化网络】MobileNet系列

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, CVPR2017 论文:https://arxiv.org/abs/1704.04861 代码: 解读:【图像分类】2017-MobileNetV1 CVPR_說詤榢的博客-CSDN博客 MobileNetV2: Inverted …

web 网页开发学习 之 vsc 的快捷方式便捷使用

我们想在vsc进行网页的开发如果能够掌握一些快捷键的技巧,那么对我们开发的帮助就会很大

windows弹出交互式服务检测怎么取消

现象 解决办法 打开控制面板->管理工具->服务->Interactive Services Detection 右键属性->常规选项卡中把启动类型选为禁用 禁用之后点击应用和确定 点击停止

Games202(P6、P7)环境光照与PRT全局光照

P6、实时环境光照 RealTime Environment Mapping 不同于全局光照 (1) IBL 我的Blog: QT with OpenGL(IBL-漫反射辐照)IBL-镜面反射(预滤波篇)IBL-镜面反射(LUT篇)QT with OpenGL(IBL-镜面反…

React refers to UMD global, but the current file is a module vite初始化react项目

vite搭建react项目 初始化项目 npm create vite 在执行完上面的命令后,npm 首先会自动下载create-vite这个第三方包,然后执行这个包中的项目初始化逻辑。输入项目名称之后按下回车,此时需要选择构建的前端框架: ✔ Project na…

机器人连续位姿同步插值轨迹规划—对数四元数、b样条曲线、c2连续位姿同步规划

简介:Smooth orientation planning is benefificial for the working performance and service life of industrial robots, keeping robots from violent impacts and shocks caused by discontinuous orientation planning. Nevertheless, the popular used quate…

Python对象序列化

迷途小书童的 Note 读完需要 7分钟 速读仅需 3 分钟 大家好,我是迷途小书童! 在 Python 开发中,我们经常需要将对象数据保存到磁盘,或者通过网络传输对象信息。这时就需要序列化,Pickle 库为我们提供了极为方便的对象序…

Python基础篇(18):模块与包

一、as 关键字的使用 1、as 关键字的作用:给导入的模块取别名 import 测试1 as Test_1 import 测试2 as Test_2Test_1.say_hello() Test_2.say_hello() 二、if __name__ __main__ 1、作用 测试当前模块所编写的代码块,根据业务自主选择需要运行的代…

433MHz芯片在遥控应用市场中的优点

当涉及到简单的无线射频通信,433MHz芯片成为一种经济实惠且广泛应用的选择。以下是关于433MHz芯片的重点信息: 工作原理:433MHz芯片的工作原理是将数字信号转化为射频信号,并通过无线信道进行传输。在接收端,射频信号再…

关于Windows11系统,使用适用于Android的windows子系统 ,安装应用后无法连接网络的问题

–by 旧人旧梦旧时光 最近在使用win11自带的android模拟器时遇到了应用无法连接网络的问题,现在得到了解决,记录一下。 经过思考,发现是由于之前无意打开了这个选项,导致的应用无法连接网络,因此,把该选项…

Topaz Photo AI for Mac(AI人工智能降噪放大软件)

Topaz Photo AI是一款专业的照片处理软件,它利用深度学习和人工智能技术,提供了强大的图像增强和修复功能。无论你是想改善照片的质量,还是想给照片添加特效和艺术效果,Topaz Photo AI都能帮助你实现。 Topaz Photo AI还具备强大…

【uni-app】—3.新建一个uni-app项目

一、新建uni-app项目 1. 打开HBuilder X 2. 新建项目 3. 配置项目信息 4. 安装Sass 插件 (因为项目需要) 这里需要登录,自行用邮箱注册登录,再下载安装插件,安装完成如下 二、项目目录扩展 1. 初始化项目目录 2. 扩…

Grafana 图表配置快速入门

Grafana图表配置 文章目录 Grafana图表配置panel图表配置预览区数据设置区查询设置区转换设置区告警设置区 图表设置区Setting设置Visualization 可视化Display 显示Axes 轴legend 图例Thresholds 阈值 参考 panel图表配置 预览区:用来预览设置的图表。数据设置区&…

【数据分析入门】【淘宝电商API接入与电商数据分析】初识Web API(一)

今天开始我们将学习如何使用Web应用变成借口(API)自动请求网站到特定信息而不是整个网站,再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化,因此即便数据瞬息万变,它呈现到信息也都是最新的。比如,我们…

算法训练营day48|动态规划 part09:打家劫舍(LeetCode 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III)

文章目录 198.打家劫舍思路分析代码实现思考总结 213.打家劫舍II思路分析代码实现 337.打家劫舍 III思路分析代码实现思考总结 198.打家劫舍 题目链接🔥🔥 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响…

NSQ和KAFKA的使用入门

【nsq vs kafka】https://zhuanlan.zhihu.com/p/46421050 【kafka】https://juejin.cn/post/6844903495670169607 NSQ 分布式内存消息队列 优势: NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,提供可高的消息交…

如何理解Java中的自动拆箱和自动装箱?

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

亚运会:举办次数最多的是泰国,观众满意度衡量赛事成功情况

本文由群狼调研(长沙第三方评估)整理出品,欢迎转载,请注明出处。8日起至9月20日,杭州第19届亚运会火炬传递启动,杭州亚运会是放开后的首个盛会,亚洲的健儿齐集于此,同场竞技&#xf…

【C++入门】C语言的不足之处

概要 C入门主要讲的是C语言的一些不足,C作为补充,来补充C的不足之处 C的关键字有63个,C语言有32个(作为了解,不需要专门记) 变量的命名规则: 变量名必须以字母或下划线开头。变量名只能包含字…