简单说说SQL中Join的使用

article/2025/9/15 23:34:11

最近工作中,遇到了一起由于慢SQL引起DB CPU > 90% ,数据库hang住。。最终导致其他业务查询统统失败。

       细看下来是由于几张大表Join关联查询引起的,故障本身很常见,不过让我想到有必要讲讲如何规避Join的问题。

       以下的讨论都是基于数据库能力有限的前提下,否则后续的讨论就可以直接忽略了。


首先,我们来谈谈SQL Join的使用场景


1)如果系统存在


高并发、分布式

业务逻辑简单

数据的一致性要求不高

允许延迟读


那么建议在SQL中少使用Join。减少join的目的是在这类业务场景下,除了直观地降低了高并发状态下的资源消耗外,更大的好处是降低了业务之间的耦合,增加了扩展性。服务就可以拆分成多个微服务和多个数据库,便于在一部分负担过重时进行增配;或者直接改为使用缓存等等。


2)如果系统存在


低并发、频繁复杂数据写入

CPU密集而非IO密集

业务逻辑通过数据库处理甚至包含大量存储过程

对一致性与完整性要求很高的系统

需要大量的报表和统计


那么是需要数据库Join的,可以说是无法避免Join。比如部分金融业务、财务系统、企业应用之类,复杂join也是不可避免的,不仅要写,还要写好,才能发挥数据库最大的功用。



对于情况1,我们有以下几种常见的方案来替代Join:


1. 分多次select取不同表的数据,然后在应用代码里做Join;

2. 各自存数据的同时,做一张宽的冗余表,从宽表里取查询数据;

3. 需要Join的数据保存在缓存中(如redis),缓存可以使用主动式(数据修改时更新缓存)或被动式(缓存删除后,读取时才加载);

4. 从独立的用户API接口进行读取。和方法1类似,在代码里做聚合。



对于情况2, 我们的目标是优化Join,提升对应的性能,常见的方案如下:


1.用小结果集驱动大的结果,目的是为了尽可能减少Join语句中的NestedLoop的循环总次数,比如,当两个表(表A和表B)Join的时候,如果表A通过WHERE条件过滤后有10条记录,而表B有20条记录。如果我们选择表A作为驱动表,也就是被驱动表的结果集为20,那么我们通过Join条件对被驱动表(表B)的比较过滤就会有10次。反之,如果我们选择表B作为驱动表,则需要有20次对表A的比较过滤。


2.保证Join语句中被驱动表上Join条件字段已经被索引,保证被驱动表上Join条件字段已经被索引的目的,正是针对上面第1点的考虑,只有让被驱动表的Join条件字段被索引了,才能保证循环中每次查询都能够消耗较少的资源,这也正是优化内层循环的实际优化方法。


3.增大Join_Buffer_Size的大小,MySQL在完成某些join需求的时候(all row join/all index /scan join)为了减少参与join的“被驱动表”的读取次数以提高性能,需要使用到join buffer来协助完成join操作。当join buffer 太小,MySQL不会将该buffer存入磁盘文件而是先将join buffer中的结果与需求join的表进行操作,然后清空join buffer中的数据,继续将剩余的结果集写入buffer中,如此往复,这势必会造成被驱动表需要被多次读取,成倍增加IO访问,降低效率(执行计划中如果现实using join buffer)。如果join语句不是很少的话,个人建议可以适当增大join_buffer_size到1MB左右,如果内存充足可以设置为2MB。


最后一点总结就是,数据不大的时候怎么做都行,就按数据库规范设计最好。数据量大的时候,为了性能就只能牺牲一些规范了。任何的规范都是在特定情况下的某种妥协,脱离了这个环境,就不一定成立了。



扫描二维码或手动搜索微信公众号【架构栈】: ForestNotes

欢迎转载,带上以下二维码即可

                         


点击阅读原文”,所有【架构栈】近期的架构文章汇总

↓↓↓


http://chatgpt.dhexx.cn/article/K6QGZlNl.shtml

相关文章

SQL-JOIN全解析

SQL-JOIN全解析 一、SQL JOIN的作用是什么?二、四种JOIN的区别三、如何使用各种join(一)准备测试数据(二)左连接(三)右连接(四)内连接(五)外连接 …

SQL中join语句详解

1.inner join(内连接) 只返回匹配的行。 select * from table_a a inner join table_b b on a.name b.name 2.left join(左外连接) 返回左表的全部数据,和右表中满足on条件的行,如果左表的行在右表中没有匹配的数据,那么这一行中右表对应…

SQL Server 数据库常用操作:多表联查(JOIN...ON语句的使用)

1.使用传统连接方式查询 (1). 有两张表Book(BookID,BookName,TypeID,AuthorID,…),BookType(TypeID,TypeName),查询每本书的书名和图书类型。 SELECT BookName, TypeName FROM Book, BookType WHERE Book.TypeID BookType.TypeID(2). 有三张表Book(Boo…

Oracle SQL中join方式总结

在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图、物化视图等联结)。SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN、 HASH JOIN等是表连接的物理实现方式。 为了更直观的了解以上join方式…

SQL语句中的join用法

SQL中join的各种用法 1.自然连接(natural join) 自然连接将表中具有相同名称的列自动进行匹配,自然连接不必指定任何同等连接条件也不能认为指定哪些列需要被匹配,自然连接得到的结果表中,两表中名称相同的列只出现一次…

sql中join的各种用法

sql中join的用法 sql中join的含义可以理解为单词“join”,用来连接两张表,join所有连接方式可以分为: 内连接,外连接,右连接,左连接,自然连接 上面这张图已经很清晰的表明了各种连接方式的语法…

SQL Server中JOIN的使用方法总结

JOIN 分为:内连接(INNER JOIN)、外连接(OUTER JOIN)。 其中,外连接分为:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接&…

sql 语法中 join 的所有用法总结(简单例子)

join 常见的用法有: 目录 left join (left outer join) right join (right outer join) join (inner join) full join(full outer join 、outer join) cross join 说明:left join 就是 left outer join、 right join 就是 r…

SQL语句各种join用法(图文)

1、INNER JOIN(内连接) select * from table A A inner join table B B on A.key B.key //内连接 2、LEFT JOIN(左连接) select * from table A A left join table B B on A.key B.key //左连接 3、RIGHT JOIN(右连接) select * from table A A right join table B B on A…

sql join中on条件后接and和where

目录 场景1:left join on a.xx b.xx and a.xx2 aa 场景2:left join on a.xx b.xx and b.xx2 aa 场景3:left join on a.xx b.xx where b.xx2 aa 场景4:inner join on a.xx b.xx where a.xx2 aa 场景5:…

详解SQL中的各种连接(JOIN)方法

详解SQL中的各种连接(JOIN)方法 简介 有时候为了得到完整的结果,我们需要从两个或更多的表中获取结果,而 SQL 就提供了 JOIN 子句,用来把来自两个或者多个表的行结合起来(基于这些表之间的共同字段) 数据库中的表可以…

SQL语句中JOIN的用法

记录:257 写SQL最高境界:SELECT * FROM 表名。当然这是一句自嘲。探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟。 一、场景 把关系型数据库A中表TEST_TB01和TEST_TB02迁移到大数据平台M(MaxCom…

SQL中连接(JOIN)子句介绍

本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法。 说明:本文的用法示例是面向 MySQL 数据库的。 1 概述 SQL 中 JOIN 子句用于把来自两个…

SQL 中 JOIN 的用法

一、概要 JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻,这次就说说JOIN操作。 图片是很容易被接受和理解,所以尝试使用图片来说明一下。 二、JOIN分类 客…

思科三层交换机IPv6静态和默认路由配置

基础配置: SWA: Switch>ena Switch#conf t Switch(config)#host SWA SWA(config)#vlan 10 SWA(config-vlan)#vlan 100 SWA(config-vlan)#int vlan 10 SWA(config-if)#ipv6 add 2001:10::1/64 SWA(config-if)#int vlan 100 SWA(config-if)#i…

Cisco 三层交换机与路由器ospf协议配置多区域area

分布操作: 1.划分vlan 2.ospf、area 3.测试ping 三层交换机2 路由器2 PC机4 路由器使用WIC-2T模块 使用DCE串口线连接 其余设备间均用直通线连接 各种预配置信息: 设备从左往右,从上往下依次为 S1,R2,R3&#…

三层交换机配置的步骤

网管不会配置三层交换机怎么办? 学啊! 交换机是企业组网的重要设备,掌握交换机配置是作为网管的必备技能。这里以三层交换机的配置为例子,说一说配置的步骤。 配置管理地址 每个交换机需要配置一个管理地址,方便后期的…

思科利用三层交换机实现 VLAN 间路由

一、实验目的 掌握三层交换机基本配置方法 掌握三层交换机VLAN路由的配置方法 通过三层交换机实现VLAN间相互通信 二、实验原理 三层交换机具备网络层的功能,实现VLAN相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的IP地址…

Cisco Packet Tracer中配置三层交换机

三层交换机介绍: 三层交换机就是具有部分路由器功能的交换机,三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。对于数据包转发等规律性的过程…

思科三层交换机配置SVI 实现VLAN 间路由

本次SVI实验参数如图: 依次三层交换我们命名为SW1,二层交换命名为SW2 下面我们开始先对二层交换机SW2进行配置 Switch>en Switch#conf t Switch(config)#host SW2 SW2(config)#vlan 20 SW2(config-vlan)#vlan 30 SW2(config-vlan)#vlan 40 SW2(config…