面试官问我为什么要尽量避免数据表的 join 查询操作

本文讨论了为何在数据库设计和编程中应尽量避免使用JOIN查询,主要基于MySQL的Nested Loop Join和Block Nested-Loop Join算法。作者指出,JOIN可能导致性能问题,特别是当涉及大量数据时。文章详细解释了两种JOIN算法的工作原理,并提供了优化建议,包括使用小表作为驱动表,开启join_buffer,以及确保JOIN条件上有索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理论指导实践,实践反过来又完善理论,没有孰轻孰重,只有相辅相成

看法

  对于开发提交的含有join的查询,一般比较抗拒,从而建议将join拆分,避免join可能带来的性能问题,同时也增加了程序和DB的网络交互。建议从数据库设计层面和应用程序编码中尽量避免join。

事实

  5.5 版本之前,MySQL本身只支持一种表间关联方式,就是嵌套循环(Nested Loop)。如果关联表的数据量很大,则join关联的执行时间会非常长。在5.5以后的版本中,MySQL通过引入BNL算法来优化嵌套执行,本文介绍两种join算法 Nested-Loop Join (NLJ) 和Block Nested-Loop Join(BNL) 。

深入原理

Nested Loop Join算法

  NLJ 算法:将驱动表/外部表的结果集作为循环基础数据,然后循环从该结果集每次一条获取数据作为下一个表的过滤条件查询数据,然后合并结果。如果有多表join,则将前面的表的结果集作为循环数据,取到每行再到联接的下一个表中循环匹配,获取结果集返回给客户端。
  Nested-Loop 的伪算法如下:

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
    }
  }
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值