在桌子上加入是否总是创建那些表格的笛卡尔积? 如果问题可以通过子查询和加入来解决,我应该选择哪个? 哪一个快速且节省内存?
所有问题都是紧密耦合的,所以请不要打开另一个帖子 :(
MySQL 5
答案 0 :(得分:2)
是的,加入始终会创建笛卡尔积。这就是为什么你通常添加一个要满足的条件:
JOIN a, b ON key_a = key_b
。如果key_b是表b中的唯一键,则对于a的每一行,b最多只能有一行。
在大多数情况下,联接速度更快,但有例外(WHERE x IN ANY (subquery)
)
见2.
答案 1 :(得分:1)
在桌子上加入是否总是创建这些表的笛卡尔积?
是的,但是然后过滤掉了normall,并且查询优化器足够聪明,可以采用更有效的方法。无论如何,所有无条件的连接都是笛卡尔产品的开始。
如果问题可以通过子查询和加入来解决,我应该选择哪个?
取决于查询优化器和相关数据。如:在尝试中。漂亮是唯一的方式。
哪一个快速且节省内存?
再次 - 尝试一下。
这个东西真的不取决于所涉及的桌子尺寸和过滤条件。基本上,物化笛卡尔积在大多数情况下是糟糕的编程(上升,忘记了适合条件)或非常糟糕的查询计划。在大多数情况下,笛卡尔积可能永远不会实现,查询优化器将使用不同的方法。
答案 2 :(得分:0)
是的,在表格上加入会始终创建这些表格的笛卡尔积。
您不能选择加入或子查询,因为它取决于您的数据大小
所以,你必须尝试两种方式,然后你可以决定哪一种更合适
到您的查询