mysql join 循环,关于mysql联表的内嵌循环操作nested loop join中on和where执行顺序问题...

mysql的理论依据没找到,个人理解是先执行where的过滤条件,先关联再过滤明显做的是无用功。

oracle中倒是能在执行计划中看到,先执行的是过滤条件(下面代码中最后一行)。

explain plan for SELECT * FROM tmp_t2 t2 LEFT JOIN tmp_t1 t1 ON t2.id = t1.id AND t1.good_id = 'A'

-----------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-----------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 3 | 147 | 6 (0)| 00:00:01 |

|* 1 | HASH JOIN | | 3 | 147 | 6 (0)| 00:00:01 |

| 2 | TABLE ACCESS FULL| TMP_T2 | 3 | 60 | 3 (0)| 00:00:01 |

|* 3 | TABLE ACCESS FULL| TMP_T1 | 3 | 87 | 3 (0)| 00:00:01 |

-----------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T2"."ID"="T1"."ID")

3 - filter("T1"."GOOD_ID"='A')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nested Loop Join是Oracle一种基于嵌套循环的连接算法,它的原理是对于两个的每一行,都对另一个进行一次扫描,找到符合条件的行进行连接,直到所有行都被连接完成。 下面通过一个案例来说明Nested Loop Join的原理。 假设有两个A和B,它们的结构如下: A: ``` id name 1 Tom 2 Jerry 3 Alice ``` B: ``` id age 1 25 2 30 3 35 ``` 现在需要将这两个按照id进行连接,并且只选择age小于等于30的记录。可以使用如下SQL语句: ``` SELECT A.name, B.age FROM A, B WHERE A.id = B.id AND B.age <= 30; ``` 这个查询语句使用了Nested Loop Join算法。具体来说,查询语句的执行步骤如下: 1. 从A读取第一行数据,即id=1,name=Tom。 2. 对于A的每一行数据,都从B的开头开始扫描。 3. 对于B的第一行数据,即id=1,age=25,它符合连接条件,因此将它和A的当前行连接起来,得到结果:Tom 25。 4. 继续扫描B的下一行数据,即id=2,age=30,它也符合连接条件,因此将它和A的当前行连接起来,得到结果:Tom 25、Jerry 30。 5. 继续扫描B的下一行数据,即id=3,age=35,它不符合连接条件,因此跳过。 6. 如果B还有未扫描的行,则返回步骤3,否则返回步骤1,继续读取A的下一行数据。 7. 从A读取下一行数据,即id=2,name=Jerry。 8. 对于A的每一行数据,都从B的开头开始扫描,重复步骤3到6,得到结果:Tom 25、Jerry 30。 9. 从A读取下一行数据,即id=3,name=Alice。 10. 对于A的每一行数据,都从B的开头开始扫描,重复步骤3到6,得到结果:Tom 25、Jerry 30。 11. 如果A还有未扫描的行,则返回步骤2,否则返回结果。 最终的查询结果为: ``` name age Tom 25 Jerry 30 ``` 可以看到,Nested Loop Join算法在这个案例的效果非常好,它很快地完成了连接操作,并且得到了正确的结果。但是,在实际应用,如果数据集非常大,那么Nested Loop Join就会变得非常慢,并且会占用大量的系统资源。因此,在实际应用,我们需要根据数据集的大小和查询的条件来选择合适的连接算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值