mysql的left join和inner join的效率对比,以及如何优化

mysql的left join和inner join的效率对比,以及如何优化一 前言最近在写代码的时候 遇到了需要多表连接的一个问题 初始 sql 类似于 select fromaleftjoi x b xleftjoincon y b yleftjoindon z c z nbsp nbsp nbsp nbsp nbsp nbsp 这样的多个 leftjoin 组合 一方面是心里有点不舒服 总觉得这种

一、前言

最近在写代码的时候,遇到了需要多表连接的一个问题,初始sql类似于:

select * from a left join b on a.x = b.x left join c on c.y = b.y left join d on d.z=c.z 

      这样的多个left join组合,一方面是心里有点不舒服,总觉得这种写法是有问题的,一方面有有点好奇,直接用inner join会怎样呢?差别在哪里?后续使用inner join发现速度要比left join快一些,所以这边就研究一下这个问题。

二、left join为什么会比 inner join 慢

1、关于逻辑运算量

      关于left join的概念,大家是都知道的(返回左边全部记录,右表不满足匹配条件的记录对应行返回null),那么单纯的对比逻辑运算量的话,inner join 是只需要返回两个表的交集部分,left join多返回了一部分左表没有返回的数据。

2、关于mysql连接的算法 Nest Loop Join(嵌套联接循环)

这个算法是mysql默认的连接算法,类似于我们php程序的三个嵌套循环:

(foreach a as v){ (foreach b as v1){ (foreach c as v2){ } } } 

      从算法上来看,根据mysql文档,inner join在连接的时候,mysql会自动选择较小的表来作为驱动表,从而达到减少循环次数的目的。我们在使用left join表的时候,默认是使用左表作为驱动表,那么此时左表的大小是我们来控制的,如果控制不当,左表比较大,那么自然循环次数也会变多,效率会下降。

MySQL Nested-Loop Join算法学习

      根据这两方面的对比,left join明显被秒成渣,但是我们的实际业务却经常需要使用left join,一切还是要以实际业务为主,所以大家还是仁者见仁智者见智的选择吧。博主这里因为业务并不是很需要left join,所以果断选择使用inner join来连接表。

三、关于 left join的优化

根据上面咱们的对比,基本可以总结出来一些简单的优化方案。

1、left join选择小表作为驱动表(这部分基本是大家的共识) 2、如果左表比较大,并且业务要求驱动表必须是左表,那么我们可以通过where条件语句,使得左表被过滤的小一些,主要原理和第一条类似 3、关联字段给索引,因为在mysql的嵌套循环算法中,是通过关联字段进行关联,并查询的,所以给关联字段索引很必要 4、如果sql里面有排序,请给排序字段加上索引,不然会造成排序使用全表扫描 参考:https://www.oschina.net/question/_ 5、如果where条件中含有右表的非空条件(除开is null),则left join语句等同于join语句,可直接改写成join语句。 6、根据文档,MySQL能更高效地在声明具有相同类型和尺寸的列上使用索引。所以把表与表之间的关联字段给上encoding和collation(决定字符比较的规则)全部改成统一的类型 7、右表的条件列一定要加上索引(主键、唯一索引、前缀索引等),最好能够使type达到range及以上(ref,eq_ref,const,system) 

注意: 此处的5、6、7参考博客:https://luxuryzh.iteye.com/blog/ ,这个博客总结的很好,强烈推荐

推荐博客阅读:

MySQL索引原理以及慢查询优化

      博主在查过各种资料之后,最终把自己的连接类型改为了inner join,并且给关联字段以及排序字段都加上了索引,速度比起刚开始的时候确实是快了不少。只是说mysql还有很多需要研究的地方,加油吧,碰到并解决,不亏~

end

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226419.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:57
下一篇 2026年3月16日 下午10:57


相关推荐

  • Pycharm如何创建项目

    Pycharm如何创建项目在本教程中 将创建一个简单的 Python 脚本 因此将选择 PurePython 此模板将创建一个空项目 第一步 如果您在欢迎屏幕上 请单击 CreateNewPro 如果您已打开项目 请选择 File NewProject 第二步 PyCharm 建议了几个用于创建各种类型应用程序的项目模板 Django GoogleAppEng 等 当 PyCharm 从项目模板创建一个新项目时 它会生成相应的目录结构和特定文件 以及任何所需的运行配置或设置 第三步 Python 的最

    2026年3月27日
    2
  • python生成器详解_Python 生成器

    python生成器详解_Python 生成器生成器利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。

    2022年8月6日
    14
  • 进入zookeeper客户端的操作步骤_ajp连接器配置secretRequired

    进入zookeeper客户端的操作步骤_ajp连接器配置secretRequiredzookeeper客户端使用原生JavaApi操作节点

    2022年4月21日
    105
  • 列车调度C语言数据结构,数据结构——列车调度

    列车调度C语言数据结构,数据结构——列车调度题目链接:https://pintia.cn/problem-sets/1045870129681440768/problems/1045870197130047495#p-2题目大意:给你一列火车,上面有表号,问给你几个火车隧道,能使车厢从大到小。一道有思维结构的模拟题。先说一下核心解体思想:就是一个序列里,有多少个从大到小排好序的序列,求个数。朴素的模拟思想,先读入一个数组,从头到尾判断,含有…

    2022年7月26日
    10
  • 高清播放之滤镜 – MadVR「建议收藏」

    高清播放之滤镜 – MadVR「建议收藏」转自:https://liutao.xyz/highdefinition_madvr/为什么推荐madVR作为渲染器1、madVR可以实现更精确的颜色处理。madVR全程在16bit/32bit下进行运算,精度远高于EVR/VMR等8bit,并抖动到8bitRGB输出。madVR的高精度运算和轻微的抖动噪声有着掩盖色带色块等作用。如果片源是10bit,madVR搭配ffdshow

    2025年11月16日
    4
  • PYthon——plt.scatter各参数详解

    PYthon——plt.scatter各参数详解 最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下:1、scatter函数原型2、其中散点的形状参数marker如下:3、其中颜色参数c如下:4、基本的使用方法如下:[python] viewplain copy#导入必要的模块   import numpy as np   import mat…

    2022年6月29日
    83

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号