前言

看一下 下面的sql语句:select * from a left join b on a.x = b.x left join c on c.y = b.y

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

left join 为什么会比 inner join 慢?

①、逻辑运算量

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

②、mysql底层连接的算法 Nest Loop Join(嵌套联接循环)

这个算法是mysql默认的连接算法,类似于我们php程序的三个嵌套循环:foreach($a as $v)

{

foreach($b as $v1)

{

foreach($c as $v2)

{

}

}

}

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

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

left join的优化

根据上面的对比,可以总结出来一些简单的优化方案如下:left join选择小表作为驱动表(这部分基本是大家的共识)

如果左表比较大,并且业务要求驱动表必须是左表,那么我们可以通过where条件语句,使得左表被过滤的小一些,主要原理和第一条类似

关联字段给索引,因为在mysql的嵌套循环算法中,是通过关联字段进行关联,并查询的,所以给关联字段加索引很有必要

如果sql里面有排序,请给排序字段加上索引,不然很容易会造成排序使用全表扫描。可参考:参考:https://www.oschina.net/question/930697_2190172

如果where条件中含有右表的非空条件(除开is null),则left join语句等同于join语句,可直接改写成join语句

根据文档,MySQL能更高效地在声明具有相同类型和尺寸的列上使用索引。所以把表与表之间的关联字段给上encoding和collation(决定字符比较的规则)全部改成统一的类型

右表的条件列一定要加上索引(主键、唯一索引、前缀索引等),最好能够使type达到range及以上(ref,eq_ref,const,system)

我们都知道,sql尽量使用数据量小的表做主表,这样效率更高,不过有时候因为逻辑要求,要使用数据量大的表做主表,此时使用left join 就会比较慢,即使关联条件有索引。在这种情况下就要考虑是不是能使用inner join 了。这是因为inner join 在执行的时候回自动选择最小的表做基础表,效率更高。

尾声

巩固下基础吧:

left join 是做左外关联,主表内容都会显示,符合关联条件的附表内容才会显示出来。left join 是 left outer join 的简写形式。

inner join 是内关联,没有主表和附表的概念,两个表中,同时符合关联条件的数据才会显示出来。join 是 inner join 的简写形式。

声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

mysql inner和left优化_浅谈mysql中的left join和inner join性能及优化策略相关推荐

  1. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  2. mysql事务的管理方式_浅谈MySQL事务管理(基础)

    本篇文章给大家带来的内容是浅谈MySQL事务管理(基础),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.事务处理用来维护数据库等完整性,保证mysql操作要么成功,要么失败(myisa ...

  3. mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  4. mysql sql优化_浅谈mysql中sql优化

    说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...

  5. mysql自定义函数的优缺点_浅谈MySQL创建自定义函数漏洞的利用和防止

    前一阵子网上风靡的MySQL的udf.dll提权我有所了解-近日由于不再在IDC行业工作了-所以也有所淡忘- 只是最近实在手痒,就决定对我的站点所在的服务器下手--.正好用上这招了- 站点的服务器是W ...

  6. mysql笛卡尔积查询很慢_浅谈MySQL使用笛卡尔积原理进行多表查询

    我就废话不多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ...

  7. 谈谈mysql优化_浅谈MySQL SQL优化

    本文首发于个人微信公众号<andyqian>,期待你的关注 前言 有好几天没有写文章了,实在不好意思.之前就有朋友希望我写写MySQL优化的文章.我迟迟没有动笔,主要是因为,SQL优化这个 ...

  8. mysql锁的应用场景_浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |-- ...

  9. 支付宝的数据库是MySQL变种_浅谈MySql的储存引擎(表类型)

    浅谈mysql的存储引擎(表类型) 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库, ...

最新文章

  1. 一些非常酷的GAN的应用
  2. 中小企业远程存储服务之利弊
  3. Springboot@Configuration和@Bean详解
  4. 送给产品经理的一段代码 (!(~+[]) + {})[--[~+][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] ...
  5. General error: 24374 OCIStmtFetch: ORA-24374: define not done before fetch or execute and fetch
  6. b站弹幕姬python_基于asyncio异步协程框架实现收集B站直播弹幕详细介绍
  7. apt-get for ubuntu 工具简介
  8. 软考复习之路—组成原理
  9. Kafka版本介绍Version2.4.0
  10. Emscripten教程之C++和JavaScript绑定(三)
  11. 网页内容复制粘贴(三种方案 兼容多种浏览器)
  12. 【原创】开车分四个阶段的话,你属于哪个
  13. windows搜索神器Everything
  14. java 自动发微博_使用node搭建自动发图文微博机器人
  15. 【解决方案】GB28181/RTSP/Onvif/HikSDK/Ehome协议视频共享平台EasyCVR人脸识别助力打造智慧安检
  16. catia刨面命令_CATIA建模技巧之分割、剖切、右键属性
  17. 重新获取新的IP地址的方法
  18. 《老路用得上的商学课》31-35学习笔记
  19. Python深度学习-第一章、什么是深度学习
  20. 【极光推送】项目包名更改后极光推送不能使用的解决办法

热门文章

  1. 运算放大器的思维导图(很不错的)
  2. file Android close,file close是什么意思
  3. Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)
  4. 将数据写入文件C语言fwrite,fwrite -- 将数据写入到文件中
  5. java如何发送ding消息,jenkins 接入ding ding 发消息
  6. chfs下载地址 CuteHttpFileServer下载地址 iscute.cn/chfs
  7. c语言程序一键删除文件,VC实现批量删除指定文件的方法
  8. 洛谷P2699 【数学1】小浩的幂次运算
  9. 【JavaLearn】 # (7)面向对象案例:猜丁壳
  10. java如何避免内存溢出_java怎样防止内存溢出