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

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

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

看法

  对于开发提交的含有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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用 LEFT JOIN 进行查询时,如果没有查询出左表的全部数据,可能有以下几个原因: 1. 条件不匹配:LEFT JOIN 是根据连接条件将左表和右表进行关联的。如果左表中的某些数据在右表中没有匹配的记录,那么在结果中将会显示 NULL 值。这意味着可能存在连接条件不正确或者左表中的数据与右表中的数据没有匹配的情况。请检查连接条件是否正确,并确保左表和右表之间有匹配的数据。 2. 过滤条件:在使用 LEFT JOIN 进行查询时,如果在查询语句中使用了 WHERE 子句或者其他过滤条件,这可能会导致只返回满足条件的部分数据。请检查您的查询语句中的过滤条件,确保没有过滤掉左表的数据。 3. 数据类型不匹配:在进行连接时,连接条件的数据类型必须匹配。如果左表和右表的连接条件使用了不匹配的数据类型,那么连接操作可能会失败,导致左表的数据没有被正确关联和查询出来。请检查连接条件的数据类型,确保它们匹配。 4. 数据完整性题:如果左表中存在缺失或者错误的数据,或者左表中的数据不符合预期的格式或规范,这可能导致无法正确查询出左表的全部数据。请检查左表中的数据是否符合预期,确保数据的完整性和正确性。 如果您仍然无法找到题所在,建议您检查查询语句、数据和连接条件,并尝试逐步调试和排除可能的题。您也可以提供更详细的查询语句和数据示例,以便更好地帮助您分析和解决题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值