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

在写left join的时候 是大表在左侧 还是小表在左侧(二)

在 SQL 中使用 LEFT JOIN 时,左表(左侧的表)的选择不仅影响结果集的完整性,还直接决定了查询性能。核心原则是:在满足业务逻辑的前提下,优先让小表作为左表,大表作为右表。但需注意,这一结论的前提是 “业务逻辑允许”—— 因为 LEFT JOIN 的核心是 “保留左表的所有记录,右表匹配不到则补 NULL”,左表的选择首先必须符合业务对结果集的要求(即需要完整保留哪些数据)。

一、为什么优先 “小表做左表,大表做右表”?

LEFT JOIN 的执行效率与左表(驱动表)的大小、右表(被驱动表)的索引 / 大小密切相关,具体原因如下:

1. 左表是 “驱动表”,决定了连接的基数

LEFT JOIN 的执行逻辑是:先遍历左表的所有行,再逐行到右表中匹配符合条件的记录。因此,左表的行数直接决定了 “需要执行多少次匹配操作”。
  • 若左表是小表(如 10 万行),则只需执行 10 万次匹配;
  • 若左表是大表(如 1 亿行),则需执行 1 亿次匹配,即使每次匹配效率很高,总耗时也会显著增加。
示例:假设左表 A 有 100 万行,右表 B 有 1 亿行,LEFT JOIN A ON B 需执行 100 万次匹配;若反过来 LEFT JOIN B ON A,则需执行 1 亿次匹配,后者的基础匹配次数是前者的 100 倍,性能差距悬殊。

2. 右表(大表)更易通过索引优化匹配效率

右表的匹配效率取决于是否有合适的索引。大表通常会为连接字段(ON 后的条件字段)建立索引(否则全表扫描成本极高),而小表即使没有索引,全表扫描的成本也很低(因为数据量小)。
  • 若右表是大表且有索引:每次匹配可通过索引快速定位(如 B+ 树索引,单次查询时间复杂度 O (logN)),即使左表是小表,整体效率也很高;
  • 若右表是小表:即使没有索引,全表扫描(O (N))的成本也可接受(比如小表只有 1 万行,全表扫描 1 万次对数据库压力很小)。
反例:若左表是大表,右表是小表且无索引,此时左表的每一行都需要对右表做全表扫描,总耗时 = 大表行数 × 小表行数,性能会急剧下降(例如 1 亿 × 1 万 = 10 万亿次操作,完全不可接受)。

3. 结果集大小可控,减少资源消耗

LEFT JOIN 的结果集行数 至少等于左表行数(右表匹配不到时补 NULL)。
  • 若左表是小表:结果集行数较少(如 10 万行),内存 / 磁盘存储压力小,后续处理(如排序、聚合)效率高;
  • 若左表是大表:结果集行数至少是大表行数(如 1 亿行),可能导致内存溢出(OOM)或磁盘临时文件暴涨,拖慢整个查询。

二、特殊场景:业务逻辑强制大表作为左表

LEFT JOIN 的左表选择不能仅看性能,必须优先满足业务需求。例如:
  • 需查询 “所有用户的订单记录(包括没有订单的用户)”,此时 用户表 必须作为左表(即使 用户表 是大表,订单表 是小表);
  • 需查询 “所有商品的销售数据(包括未销售的商品)”,商品表 必须作为左表(无论大小)。
这种情况下,只能接受大表作为左表,但可通过以下方式优化性能:
  1. 给右表的连接字段建立索引(如 订单表.user_id),减少匹配耗时;
  2. 对左表进行过滤(如 WHERE 左表.日期 > '2023-01-01'),减少左表的实际行数;
  3. 避免在 LEFT JOIN 后使用 SELECT *,只查询必要字段,减少数据传输和存储成本。

三、不同数据库的优化器差异

部分数据库(如 PostgreSQL、Oracle)的优化器会对 JOIN 进行 “重排序”,但 LEFT JOIN 因语义限制(必须保留左表所有行),优化器无法交换左右表顺序。例如:
  • A LEFT JOIN B 中,优化器必须以 A 为驱动表,无法自动将 B 作为驱动表(即使 B 更小)。
而 MySQL 的优化器对 LEFT JOIN 的重排序限制更严格,几乎完全遵循用户指定的顺序。因此,用户必须主动选择更优的左表,不能依赖优化器自动调整。

四、总结:左表选择的优先级

  1. 业务优先:左表必须是 “需要完整保留所有记录” 的表(如 “用户表”“商品表”),这是 LEFT JOIN 的语义决定的;
  2. 性能优化:在满足业务的前提下,优先选择小表作为左表,大表作为右表,理由是:
    • 减少驱动表的行数,降低匹配次数;
    • 大表作为右表时,更易通过索引优化匹配效率;
    • 控制结果集大小,减少资源消耗。
一句话结论:先看业务需要保留哪个表的全部数据,再在这个前提下,选小的那个表做左表。
http://www.gsyq.cn/news/26372.html

相关文章:

  • TLS1.2 和 TLS1.3的简要区别
  • 2025 年合肥养老院最新推荐排行榜权威发布:甄选优质机构,深度解析医养结合优势与选择指南合肥智慧/医养结合/社区/瑶海区养老院推荐
  • 程序内存模型
  • 如何从0到1制作一个免费的二维可视化项大屏
  • 2025 年集成电路封装厂家最新推荐榜:甄选技术领先实力厂家,涵盖制造检测测试领域权威名录
  • 实用指南:logbuffer 概念及题目
  • WPF使用MediaCapture开发相机应用(三、相机拍照)
  • 2025年磨粉机厂家权威推荐榜:雷蒙磨粉机/环辊磨粉机/摆式磨粉机/矿石磨粉机/超细磨粉机/高压磨粉机,专业实力与高效生产之选
  • 2025陶瓷过滤机实力厂家推荐,铜陵杰达机械专注固液分离设备制造
  • Vue技术之Vxe-Table的虚拟滚动
  • 详细介绍:大模型落地的四大核心引擎:从技术突破到产业重构
  • EasyCVR视频汇聚平台GB28181级联异常排查:上级订阅信息无响应的根源解析
  • 2025 年最新烘干机生产厂家推荐榜单:覆盖多品类需求,聚焦高效节能与品质保障食品/蔬菜/滚筒/木材/药材/大型烘干机厂家推荐
  • 完整教程:这个叫DOCX-MCP的开源项目,解决了AI操作Word的一个大麻烦
  • XMLType 测试记录
  • 开源能源管理系统 MyEMS:赋能企业降本增效,加速能源数字化转型
  • 深入解析:LabVIEW超声换能器成像
  • 2025南京鑫铭机械厂家推荐:精密钣金加工与天文台圆顶定制专家
  • 2025工业臭氧检测仪实力厂家推荐,逸云天电子专业提供多场景精准监测方案
  • 2025潮流服饰实力厂家推荐,COVERNAT乐酷天打造品质穿搭新选择
  • 详解ROMA中复杂图表的渲染实现
  • 生成式AI购物助手Rufus的技术架构解析
  • 2025数控滚齿机实力厂家推荐,无锡吉莱特智能装备高精度定制!
  • KDE connection to the service lost
  • hash判断两个集合是否完全相同
  • 2025微弧氧化加工厂家推荐:常州华源专业表面处理技术供应商
  • 2025防腐工程厂家推荐:无锡华金喷涂技术领先,定制防腐解决方案
  • 2025年10月全屋智能家居品牌推荐:盈趣领衔对比评测榜
  • Java 多线程编程详解
  • [LangChian] 05.结构化提示词