数据库优化<三>SQL优化之SELECT优化 ——JOIN和LEFT JOIN 和 RIGHT JOIN

MySQL 过滤/筛选 LEFT JOIN 派生表中的聚合的字段 碰到了一个需求,需要判断一个由left join的表(派生表)的字段(列)聚合而成的字段中是否包含有某个字符串。 查询了网上的一些资料,发现基本没有说到怎么使用WHERE对LEFT JOIN的右表聚合出的字段进行筛选。但是最后也是还到了一个比较巧妙的办法对其进行筛选。记录一下。 具体如下: 需要判断interests中是否含有某个interest。 1.数据库中的相应表 数据表: (ps:只截取了本需求中有用的部分) cp_interests:(兴趣表) cp_signups:(报名表) cp_sigh 阅读详情

         在数据库的应用中,我们经常需要对多表进行连表操作来获得关系型的数据,因此,应该更加的掌握好

SQL语句的join原理,因为,可以稍一不慎,可能一个不好的join导致数据库的全表扫描,查询出大量的

无用的信息,并且对数据库性能影响极大。

         数据库中的join操作,实际上是对一个表和另一个表的关联,而很多错误的理解为,先把这两个表来一个

迪卡尔积,然后扔到内存,用where和having条件来慢慢筛选,其实数据库没那么笨的,那样会占用大量的内

存,而且效率不高,比如,我们只需要的一个表的一些行和另一个表的一些行,如果全表都做迪卡尔积,这开

销也太大了,真正的做发是,根据在每一个表上的条件,边遍历一个表的同时,遍历其他表,找到满足最后的

条件后,就发送到客户端,直到最后的数据全部查完,叫做嵌套循环查询。

1,LEFT JOIN 和 RIGHT JOIN优化

在MySQL中,实现如 A LEFT JOIN B join_condition 如下:

          1,表B依赖赖与表A及所有A依赖的表

          2,表A依赖于所有的表,除了LEFT JOIN 的表(B)

          3,join_condition决定了怎样来读取表B,where条件对B是没有用的

          4,标准的where会和LEFT JOIN联合优化

          5,如果在A中的一行满足where和having条件,B中没有,会被填充null

 RIGHT JOIN 与LEFT JOIN类似,这个位置是可以互换的

2.1、LEFT JOIN 与 正常JOIN之间的转换

        原则:当where条件,对于生成的null行总返回false时,可以直接转化为

                     正常的join

        如:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
        将被转换为:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
        注:因为设置了条件t2.column2 =  5,那么对于所有的生成的t2为null的行都是不成立的

                这样的优化将非常快速,因为这样相当于把外连接转换为等值连接,少了很多行

                的扫描和判断。

2.2嵌套循环JOIN算法----Nested-Loop Join 

        简单的嵌套循环算法就是从一个表开始,通过对表的条件找到一行,然后找下一个表

        的数据,找完后,又回到第一个表来寻找满足条件的行


例如,有三个表t1, t2, t3,他们的join类型为:

Table   Join Type
t1      range
t2      ref
t3      ALL
即,t1表通过范围扫描,t2关联t1,t3为全表扫描

这三个表的伪代码为:

for each row in t1 matching range {
  for each row in t2 matching reference key {
    for each row in t3 {
      if row satisfies join conditions,
         send to client
    }
  }
}
注:意思是:先根据对t1表的条件范围找到一行,和t2匹配,然后寻找t3的满足条件的行

         如此循环迭代,最终找到全部满足条件的行。

2.3块嵌套循环JOIN算法 ---- Block Nested-Loop Join

         这个算法的应用为:由于之前的嵌套算法每读一个表的一行后,就会读下表,这样

          内部的表会被读很多次,所以,数据库利用了join缓存(join buffer)来存储中间的结

          果,然后读取内部表的时候,找到一行,都和这个缓存中的数据比较,以此来提高

          效率。例如:一次从外表读10行,然后读内部表时,都和这10行数据进行比较。

MySQL使用join buffer的条件为:

          1,join_buffer_size系统变量决定了每个join使用的buffer大小

          2,join类型为index或all时,join buffer才能被使用

          3,每一个join都会分配一个join buffer,即一个sql可能使用多个join buffer

          4,join buffer 不会分配给第一个非常量表

          5,只有需要引用的列会被放到join buffer中,不是整行

如以下例子:

for each row in t1 matching range {
  for each row in t2 matching reference key {
    store used columns from t1, t2 in join buffer
	    这里将t1和t2使用的列存到join buffer中
	    if buffer is full {
      for each row in t3 {
        for each t1, t2 combination in join buffer {
          if row satisfies join conditions,
          send to client
        }
      }
      empty buffer
    }
  }
}

if buffer is not empty {
  for each row in t3 {
    for each t1, t2 combination in join buffer {
      if row satisfies join conditions,
      send to client
    }
  }
}
注:注意到一点:是在第二个循环才把数据存在join buffer中,这正好印证了上面的第4点



SpringBoot集成MyBatis-Plus-Join 1.基本配置 2.字段填充 3.crud 4.代码生成 立即下载

相关推荐

mybatis-plus-join:支持连表查询的mybatis-plus,mybatis-plus风格的连表操作提供wrapper.leftJoin(),wrapper.rightJoin()等操作

mybatis加联接 支持连表查询的 使用方法 通用连表包装 安装 在项目中添加依赖 < dependency> < groupId>com.github.yulichang</ groupId> < artifactId>mybatis-plus-join</ artifactId> < version>1.1.1</ version> </ dependency> 或者克隆代码到本地,执行mvn install,再重新以上依赖 添加配置文件 @Configuration public class MybatisPlusConfig { /** * 启用连表拦截器 */ @Bean public MybatisPlusInterceptor paginationInterceptor () {

sql基础知识left join,right join,inner join区别

1.left join即以左表为主查出左bian

4769

地震勘探原理---地震预处理

3.1 为什么说要对数据进行振幅补偿?具体来说,地震波在传播过程中会遇到各种各样的地质条件,例如不同的岩层、土壤、水层等,这些介质的密度、速度等特性不同,因而对地震波的能量消耗也有所不同。在传播距离较远的情况下,能量损失可能会导致接收到的地震信号振幅变小。相反,在传播距离较近的情况下,能量损失可能较小,导致接收到的地震信号振幅变大。如果不对数据进行振幅补偿,这种振幅不均衡会导致地震数据分析和解释的误差和不确定性增加,可能产生错误的结论。

DARRENANJIAN的博客 3274

mybatis plus selectJoinPage 查询太慢问题解决

mybatisPlus 默认的count sql是 select count(*) from (sql),sql为查询数据的sql.通过测试发现select 里没有distinct的关键字,只扫主表,如果加上distinct关键字就会扫整个sql。通过打印sql发现,是获取total时查询过慢,因为使用了多个leftJoin.最重要 是这点:.使count里的sql只有主表,没有leftJoin表。分析:因为分页本身数据不大,最多也就几十条,速度不应该太慢。项目中遇到,数据量如果过大,分页查询就很慢。

qq_43921238的博客 3569

深信服桌面云实战:从零部署到高效运维的配置全景指南

本文详细介绍了深信服桌面云从零部署到高效运维的全流程配置指南,涵盖硬件规划、平台部署、虚拟桌面发布、终端管理及性能优化等关键环节。特别强调了双万兆网络架构、分布式存储配置和智能调度功能的应用,帮助用户实现高性能、高可用的虚拟桌面环境。

weixin_28568819的博客 401

基于YOLO11的垃圾分类AI模型训练实战

通过这次实战,我们成功训练出了一个高性能的垃圾分类AI模型。项目展示了从数据准备、模型训练到结果分析的完整流程,为AI在环保领域的应用提供了有价值的参考。项目文件结构│ ├── best.pt # 最佳模型权重│ └── last.pt # 最新模型权重├── results.csv # 详细训练数据├── results.png # 训练曲线图├── confusion_matrix.png # 混淆矩阵└── args.yaml # 训练参数配置。

lydz1的博客 1657

步步深入MySQL:架构->查询执行流程->SQL解析顺序!

作者 :AnnsShadoW来源:www.cnblogs.com/annsshadow一、前言一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结...

Java之间 391

C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示(附源码)

上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析,这节课将使用到显示列表、兼容视图、屏幕图形转纹理等操作。

zhooyu的博客 1498

步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

Java面试笔试面经、Java技术每天学习一点Java面试关注不迷路作者:AnnsShadoW来源:https://www.cnblogs.com/annsshadow/p/503766...

java面试笔试 205

ZYNQ系列PS侧和PL侧DDR3或DDR4在AD(Altium Designer 25)中的layout布线规则约束

DDR3或DDR4的PCB布线规则通常有相对固定的要求,对应的,在PCB设计时有固定的约束设置。

FPGA艺术家的博客 787

STM32串口编程基础知识讲解

本篇文章给大家介绍一下串口的基础编程知识,这些知识是属于串口的理论知识,在开始学习编写代码的时候必须要掌握这些基本的知识点。本篇文章讲解了串口的基本概念知识,大家在学习编写代码时将其掌握才能更好的理解代码。

m0_49476241的博客 1208

Yii2 查询构建器(Query Builder)完全指南:以 `yii\db\Query` 编程式构建安全、跨数据库的 SQL

本文基于 [docs/guide-fr/db-query-builder.md](https://link.gitcode.com/i/dac53bac4617510b55c12ca991506e99) 官方指南,系统讲解 Yii 2 查询构建器的完整用法:如何在 [DAO 数据库访问对象](https://link.gitcode.com/i/7b43cb698a0f9ad92c89684ad4

gitblog_00551的博客 92

【软件系统架构】系列六:系统工程

系统工程是一种跨学科方法论,用于分析、设计、集成和管理复杂系统的全生命周期。其核心特点包括系统性思维、全周期管理、跨学科协作和需求导向。主流采用V模型生命周期,涵盖需求分析、系统设计、实现、测试验证及运维退役等阶段。核心工作方法包括需求工程、系统建模、接口设计、风险管理等。系统工程与项目管理协同,分别侧重技术实现和进度资源管理。应用领域覆盖航天军工、智能制造、智慧城市等。未来将向AI融合、数字孪生、模型驱动工程等方向发展,为复杂系统开发提供系统化协作范式。

moton2017的博客 2257

Mysql入门到精通全集(SQL99)包含关系运算,软考数据库工程师复习首选

本文系统梳理了MySQL数据库的核心知识点,包括数据库基础概念、SQL语句分类、数据操作语言、数据定义语言、事务控制、存储引擎、索引、视图、数据库设计范式等。重点介绍了DQL查询语句的各种用法,如条件查询、分组查询、连接查询等,以及DDL语句的表操作和约束设置。同时详细讲解了触发器、存储过程、变量、流程控制等高级功能,并全面归纳了MySQL内置函数的分类和使用方法。全文结构清晰,内容全面,涵盖了MySQL数据库从基础到高级的核心技术要点,可作为MySQL学习的系统性参考文档。

渣渣盟的博客 1万+

3D LUT Color Conversion之总体架构设计之三

摘要:本文提出了一种基于三维坐标一维化寻址的四面体网格编码方法。通过定义全局网格坐标P(R,G,B)=R+9G+81B和局部增量(ξ,η,ζ)∈{0,1},推导出偏移量Δ(ξ,η,ζ)=ξ+9η+81ζ的平移不变性质。该方法将6种坐标排序情况(Case)对应的固定偏移量三元组预先存储,其中V0和V3的偏移量恒定为0和91。硬件实现时只需根据Case选择对应常量组,无需实时计算坐标,显著提高了处理效率。该方案利用线性寻址公式的特性,确保相同局部结构在不同位置具有一致的偏移模式。(149字)

大熊 48

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Yii 2 查询构建器(Query Builder)完全指南:从链式构建到源码级 SQL 生成原理

本篇指南以 Yii 2 官方文档(俄文版 [db-query-builder.md](https://link.gitcode.com/i/73a97c4daa86bec1a1a49dec777d278c) 为主体,并对照英文原版 [db-query-builder.md](https://link.gitcode.com/i/d6b67753410b12c1339db02a268f963f))为

gitblog_00361的博客 95

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JavaWeb学习

#前端部分(了解)课程思路、前端要素(Web了解、html、JS、vue、ajax、Element等)传统路线现在课程大纲路线## 前端要素(Web了解、html)HTML语法特点基本标签html标签(span)html标签(a)html标签(video)盒子模型:html标签(div)html标签(表格)html标签(表单)## 前端要素(JS)JS引入方式JS基础语法JS函数JS对象(基础(只关注Array、String、JSON)、BOM、DOM)JS事件监听## 前端要素(Vue)插值表达式Vue常

qq_2634545805的博客 430

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MyBatis-Plus 不支持联表?一个依赖轻松搞定

「关注“石杉的架构笔记”,大厂架构经验倾囊相授」文章来源:【公众号:一行Java】前言MyBatis-Plus 不支持联表,遇到复杂查询依然还是麻烦,怎么办?MyBatis-Plus 要想实现联表查询,只需要引入一个依赖mybatis-plus-join,就能完美解决。准备本文,需要你对 MyBatis-Plus 有一定的了解~“示例源码地址:https://github.com/vehan...

石杉的架构笔记 1964

查询(select)的补充

一、关联查询 1、内连接:inner join 实现(A表∩B表)的情况 语句: 两表连接:         select 字段列表         from A表名 inner join B表名    &nb...

ganfanqiang的博客 821

关键字

SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER J

356

5.1.3 SELECT+LEFT JOIN读取数据

5.1.3 SELECT+INNER JOIN读取数据 语法结构: LEFT JOIN:查询结果集中包含左表中的所有数据记录,右表中仅查询出包含相对应的匹配条件的数据 LEFT JOIN图示如下: 2021年9月10日 写于芜湖 ...

831

MybatisPlus的联表分页查询+动态拼接主子表条件

MybatisPlus动态联表分页查询

niewenxue的博客 9502

不写SQL一行代码实现多表联查与数据封装【MyBatis-Plus-Join的基本使用】

不写sql一行代码实现多表连查与数据封装,一对多查询利器

C3245073527的博客 4722

sql LEFT JOIN SELECT

SELECT a.qid, b.search_count, b.search_user FROM oracledb.tmp_qid_20191012 a LEFT JOIN ( SELECT get_json_object (t.extend, ‘.questionId′)ASquestionId,count(1)ASsearchcount,count(DISTINCTt.machineid)AS...

红尘的雨,迷人的你 9417

MyBatisPlus实现多表查询

通过以上步骤,你可以在你的项目中使用MyBatis-Plus Join扩展来实现多表关联查询。MPJ提供了一种简洁的方式来构建和执行多表查询,无需编写复杂的XML配置文件。你可以通过配置Join条件来实现多表查询,这种方式更加灵活,适用于复杂的多表查询场景。: 在你的Mapper接口中,你可以使用MPJ提供的API来构建多表查询。: 首先,你需要在你的项目中引入MyBatis-Plus-Join的依赖。: 使用MyBatis-Plus的动态SQL功能,可以在运行时构建多表查询。

2303_81990289的博客 4006
上一篇: 数据库优化<二>SQL优化之SELECT优化 ——mysql内部优化策略
下一篇: 数据库优化<四>SQL优化之SELECT优化—mysql Innodb索引
清风乐逍遥
博客等级 码龄14年 42粉丝 68原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值