(SQL)JOINING在TABLES上总是创建那些表的笛卡尔积?

时间:2011-04-12 06:49:31

标签: mysql sql

在桌子上加入是否总是创建那些表格的笛卡尔积? 如果问题可以通过子查询和加入来解决,我应该选择哪个? 哪一个快速且节省内存?

所有问题都是紧密耦合的,所以请不要打开另一个帖子 :(

MySQL 5

3 个答案:

答案 0 :(得分:2)

  1. 是的,加入始终会创建笛卡尔积。这就是为什么你通常添加一个要满足的条件: JOIN a, b ON key_a = key_b。如果key_b是表b中的唯一键,则对于a的每一行,b最多只能有一行。

  2. 在大多数情况下,联接速度更快,但有例外(WHERE x IN ANY (subquery)

  3. 见2.

答案 1 :(得分:1)

  

在桌子上加入是否总是创建这些表的笛卡尔积?

是的,但是然后过滤掉了normall,并且查询优化器足够聪明,可以采用更有效的方法。无论如何,所有无条件的连接都是笛卡尔产品的开始。

  

如果问题可以通过子查询和加入来解决,我应该选择哪个?

取决于查询优化器和相关数据。如:在尝试中。漂亮是唯一的方式。

  

哪一个快速且节省内存?

再次 - 尝试一下。

这个东西真的不取决于所涉及的桌子尺寸和过滤条件。基本上,物化笛卡尔积在大多数情况下是糟糕的编程(上升,忘记了适合条件)或非常糟糕的查询计划。在大多数情况下,笛卡尔积可能永远不会实现,查询优化器将使用不同的方法。

答案 2 :(得分:0)

是的,在表格上加入会始终创建这些表格的笛卡尔积。
您不能选择加入或子查询,因为它取决于您的数据大小
所以,你必须尝试两种方式,然后你可以决定哪一种更合适 到您的查询