当前位置: 首页 > news >正文

SQL性能优化指南:如何优化MySQL多表join场景

多表join问题SQL

对于某个复杂业务场景,通常需要根据多个过滤条件才能拿到两个表中的信息。例如,某开发同事费了半天劲写了一个多表join的SQL实现了功能,但上线后却发现对应接口响应特别慢,通过一步步排查后才定位到问题SQL,SQL如下:

select cell.*, res.pod_name from dbfree.dbins_cell cell right join dbfree.dbins_resource res on 
cell.ip = res.pod_ip where cell.ip in ('10.174.156.14', '10.174.187.144', '10.174.67.11') and
res.path in ('/dev/sdb6', '/dev/sdb5') order by res.namespace;

看下该问题SQL的执行计划: 

image

 

执行计划中可以看到两个表的type都是ALL,且cell表的Extra中出现 Using join buffer (Block Nested Loop),代表两个表发生了全表扫描,且使用了join buffer。

这里解释下 Using join buffer (Block Nested Loop):
Using join buffer:表示 MySQL 在执行JOIN时使用了连接缓冲区。这意味着外层表的部分行被加载到内存中,以便与内层表进行匹配。

(Block Nested Loop):指的是 MySQL 使用了块嵌套循环算法,而不是简单的嵌套循环。这种方法优化了JOIN操作,尤其是在内层表没有索引时,能够提高连接的性能。

对性能产生的影响:
内存使用: 使用连接缓冲区意味着 MySQL 会消耗更多内存,因此可以处理更大块的数据,从而减少 I/O 操作并提高性能。

缺乏索引: 这个提示通常表明内层表缺乏合适的索引,导致 MySQL 需要通过全表扫描的方式来处理JOIN操作。虽然 Block Nested Loop比简单的嵌套循环更高效,但相较于使用索引,仍然可能比较慢。

三种join算法介绍
join操作是一种将两个或多个表的行结合起来的方法,本质就是把各个表中的记录都取出来依次匹配的组合加入结果集并返回给用户。

例如SQL:

select * from employee e join department d on e.id = d.employee_id

join操作主要使用以下几种算法:
(1)Nested Loop Join
这是最基本的连接算法,也被称为嵌套循环连接。对于第一个表中的每一行,它会扫描第二个表中的所有行来寻找匹配的行。这种方法的效率通常较低,特别是当表的大小增加时,因为它需要进行大量的磁盘I/O操作。

相当于两个嵌套for循环:

 for(employee表行 eRow : employee表){for(department表的行 dRow : department表){if(eRow.id = dRow.emp_id){return eRow;}}
}

image

 

http://www.rkmt.cn/news/188786.html

相关文章:

  • CCF-GESP计算机学会等级考试2025年12月二级C++T2 黄金格
  • List集合
  • 下载 | Windows Server 2016最新原版ISO映像!(集成12月更新、标准版、数据中心版、14393.8692)
  • ⚡ 实时控制也能多线程?高效并行机制解析-SFTW-Multithreading
  • 专科生必看!8个降AI率工具高效避坑指南
  • 跨年夜收转账这么回,笑到他心甘情愿再转“
  • linux系统加固
  • 异步线程加速实时模型:多线程效率提升实战-SFTW-FIFO
  • 2025最新!9款AI论文平台测评:本科生写论文必备推荐
  • 日语契机相关
  • 动态重构与实时模型切换-SFTW-MutiModel
  • 双碳背景下24小时分时综合能源系统低碳优化调度实践
  • 用禅道做好项目管理!这几个常用功能你用对了吗?
  • 氧化铝陶瓷基板检测:筑牢电子核心的品质防线
  • 日语时间相关
  • 日语助动词与名词、形容词与动词的变形之间的关系
  • 样本库的管理者最担心什么?是温度波动吗?还是湿度异常呢?
  • 日语动词的意志型、可能型、假定型、被动型、使役型
  • 日语助动词和补助动词的区别
  • 2025年UWB超宽带定位模块产品技术对比与应用方案解析
  • MySql 5.7 索引不存在则创建,存在则忽略
  • vue基于Python+Django的高校考培中心考试培训管理服务系统
  • cookie操作类(加密,获取,删除)
  • 小学生刚近视!怎么让孩子近视度数涨得慢些?
  • 小学生近视加深太快怎么控制?这些方法你用对了吗?
  • 西门子Smart200 PLC 自抗扰控制(ADRC):超越传统的PID算法
  • Linux top 命令详解:系统监控的必备工具
  • 智能化锂矿选矿线:接近传感器的耐磨挑战
  • vue基于python的牛奶品牌商城评价积分系统_r144o
  • vue基于ssm技术的婚纱照摄影预约系统_dbx29