MySQL为什么不建议使用多表JOIN

一、典型回答

  之所以不建议使用JOIN查询,最主要的原因就是JOIN的效率比较低。

  MySQL是使用了嵌套循环(Nested-Loop Join)的方式实现关联查询的,简单点说就是要通过两层循环,用第一张表做外循环,第二张表做内循环,外循环的每条记录跟内循环中的记录作比较,符合条件的就输出。

  而具体到算法实现上主要是simpl nested loop,block nested loop和index nested loop这三种。而且这三种的效率都没有特别高的。

  MySQL使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,如果有2张表JOIN的话,复杂度最高是O(n^2),3张表则是O(n^3)...随着表越多,表中的数据量越多,JOIN的效率会呈指数级下降。

二、JOIN

  在MySQL中,可以使用JOIN在两个或多个表中进行联合查询,JOIN有三种,分别是INNER JOIN、LEFT JOIN、RIGHT JOIN。

  INNER JOIN(内连接或等值连接):获取两个表中字段匹配关系的记录,取两个表的交集部分。

  LEFT JOIN(左连接):获取左表左右记录,即使右表没有对应匹配的记录,取两个表的交集部分+左表中的数据。

  RIGHT JOIN(右连接):与LEFT JOIN相反,用户获取右表所有记录,即使左表没有对应匹配的记录,取两个表的交集部分+右表中的数据。

三、嵌套循环算法

  MySQL使用了嵌套循环(Nested-Loop Join)的方法来实现关联查询的,simpl nested loop,block nested loop和index nested loop三种。

  simpl nested loop:他的做法简单粗暴,就是全量扫描连接两张表进行数据的两两对比,所以他的复杂度可以认为是N*M(N是驱动表的数量,M是被驱动表的数量)。

  block nested loop:当inner loop的表用到字段来索引的话,可以用到索引进行查询数据,因为索引是B+树的,复杂度可以近似认为是N*logM。

  index nested loop:引入了BUFFER,会提前把外循环的一部分结果放到JOIN BUFFER中然后内循环的每一行都和整体BUFFER的数据作比较,索然比较次数还是N*M,但是因为JOIN BUFFER是基于内存的,所以效率高很多。

  所以,虽然MySQL已经尽可能的在优化了,但是这几种算法复杂度还是挺高的,这也是说为什么不建议在数据库中多表JOIN的原因,随着表越多,表中的数据量越多,JOIN的效率会呈指数级下降。

四、不能用JOIN如何做关联查询

  如果不能通过数据库在关联查询,那么需要查询多表数据的时候要怎么做呢?

  主要有两种方法:

    1、在内存中自己做关联,即先从数据库中把数据查出来之后,在代码中进行二次查询,然后再进行关联。

    2、数据冗余,那就把一些重要的数据在表中做冗余,这样就可以避免关联查询了。

    3、宽表,就是基于一定的JOIN关系,把数据库中多张表的数据打平做一张大宽表,可以同步到ES或者干脆直接在数据库中直接查出来。

参考:Hollis

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目验收测试有必要找第三方软件测试机构吗?

在当今信息技术飞速发展的时代,软件测试成为了确保软件质量的重要环节。而在项目的验收测试中,很多企业都面临一个问题,那就是是否有必要找第三方软件测试机构进行验收测试?今天,我们就来探讨一下这个问题。 第三方软件测试机构…

python中的nan是什么意思

NaN(not a number),在数学表示上表示一个无法表示的数,这里一般还会有另一个表述inf,inf和nan的不同在于,inf是一个超过浮点表示范围的浮点数(其本质仍然是一个数,只是他无穷大&…

如何制作自己的网站

制作自己的网站可以帮助个人或组织在互联网上展示自己的品牌、作品、产品或服务。随着技术的发展,现在制作网站变得越来越简单。下面是一个简单的步骤指南,帮助你制作自己的网站。 1. 确定你的网站需求和目标 在开始之前,你需要明确你的网站的…

左右旋分辨

从端头看,切削路径顺时针是右旋,反时针左旋。

【JVM-1】JVM内存结构

目录 什么是JVMJava源码执行机制class文件的组成部分 JVM跨平台原理JVM的组成堆年轻代与老年代对象分配过程GC类型Full GC触发条件:对象进入老年代的触发条件 对象分配过程: 字符串常量池静态变量线程本地分配缓冲区(TLAB)TLAB相关…

SpringBoot前后端传递数据时常用的JSON格式数据是什么?【讲解JSON概念、语法、以及Java对象互转】

SpringBoot前后端传递数据时常用的JSON格式数据是什么? JSON概念JSON语法JSON的两种结构:JSON字符串和Java对象互转:objectMapper.writeValueAsString(person);objectMapper.readValue(jsonStr,Person.class); 在SpringMVC框架中,…

【GitOps】使用Google工具JIB实现本地无需安装容器推送镜像,加速SpringCloud项目开发

文章目录 一、效果展示二、简介三、安装Jib插件1、区分环境2、安装插件一、效果展示 本地是window系统,无docker环境,没有任何runtime,使用jib工具打包镜像并推送完成,用时20秒 二、简介 Jib 是 Google 开发的一款开源工具,旨在帮助 Java 开发者更高效地将 Java 应用程…

ZNB40 矢量网络分析仪

ZNB40 矢量网络分析仪 100kHz至40GHz的宽频率范围,具有四个端口和附加信号发生器 概述 R&SZNB40 提供 100 kHz 至 40 GHz 的宽频率范围,具有四个端口和附加信号发生器。 罗德与施瓦茨带四个端口和附加内部信号源的 40 GHz 中档矢量网络分析仪&…

Ubuntu20.04安装python2和python3及版本配置

Ubuntu20.04安装python2和python3及版本配置_ubuntu 20.04 python3-CSDN博客https://blog.csdn.net/pangc2014/article/details/117407413 >>>ubuntu 安装源码python2_mob649e8161c39d的技术博客_51CTO博客https://blog.51cto.com/u_16175489/7327966

【Academy】测试WebSockets安全漏洞Testing for WebSockets security vulnerabilities

测试WebSockets安全漏洞Testing for WebSockets security vulnerabilities 概述WebSockets是什么?HTTP和WebSockets有什么区别?如何建立WebSocket连接?WebSocket消息看起来像什么? 操纵WebSocket流量拦截和修改WebSocket消息重放和生成新的W…

ONLYOFFICE 8.1:引领桌面办公新潮流,功能升级全面提升

目录 一、ONLYOFFICE是什么? 二、功能完善的PDF编辑器 三、幻灯片版式升级 四、改进从右至左显示 五、新的本地化选项 六、多媒体功能增强 七、应用价值探讨 一、ONLYOFFICE是什么? ONLYOFFICE 是一款功能强大的办公套件,旨在提供全面…

什么是云服务器镜像,如何选择?

云服务器镜像是一种用于业务连续性、灾难恢复和备份的技术手段,其本质是云端创建的服务器数据副本。 这些镜像内容可以涵盖系统、光盘、软件、网站甚至整个服务器,主要用于创建容错和冗余服务器计算基础架构,为用户提供了一个方便且可靠的解…

YOLOv8改进 | 注意力机制 | 轻量级的空间组增强模块SGE【全网独家】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录:《YOLOv8改进有效涨…

python项目运营时,出现,redis用户密码未设置问题,排查解决

一、问题描述: 在本地化开发过程中,pythonDjango运行项目,redis为本地windows版本,在设置过密码后,仍然会出现pythonDjango运行项目,终端日志显示如下: INFO info信息 ERROR redis数据库异常[&…

内网安全【4】SSH隧道技术

1.四大隧道协议 (1)SMB协议 判断:445端口是否开放 (2)ICMP协议 判断:ping命令能通说明使用icmp协议 (3)DNS协议 判断:nslookup www.baidu.com 属于UDP iodine工作原理是 ,通过TAP虚拟网卡,在服…

大厂面试经验分享,小白如何在面试中脱颖而出

前言 毕业季,对于每一位即将步入社会的学子来说,都是一个充满挑战和机遇的时刻。作为我的一位好朋友也是好学长,他刚刚在一家顶尖科技公司斩获了他梦寐以求的职位。他深知求职路上的艰辛,因此打算把自己的经验分享给大家&#xf…

一键掌握多渠道推广效果!Xinstall超级渠道功能,让你的App推广更高效

在App运营的大潮中,如何高效、精准地推广App,成为每一位运营者关注的焦点。传统的推广方式,如地推、代理、分销、广告等,虽然能够带来一定的用户增长,但如何衡量推广效果、如何与合作伙伴结算、如何管理下属渠道等问题…

Java程序递归及mybatis递归查询

之前项目组有个需求,定时同步机构的信息。已知三方接口由于返回数据量很大,所以最后需要三方提供一个可根据机构编号获取当前机构及子机构信息的接口。而不是一次性返回全部机构信息! 由于这次需求也用到了递归,所以记录下&#…

2024.6.26 刷题总结

2024.6.26 **每日一题** 526.优美的排列,该题考察的是状压dp的知识,用一个n位的二进制数表示排列中的数被选取的情况,若为1,则表示该位被选取,若为0,则表示该位没有被选取,用一个数组来存储当前…

【Vue】集成富文本编辑器

这文章使用的是wangeditor插件&#xff0c;官网地址&#xff1a;wangEditor&#xff0c;这个比较简单 安装 npm i wangeditor --save 使用 <div id"editor"></div>import E from "wangeditor"const editor new E("#editor") e…