使用MySQL时,join是否每次都会生成笛卡尔积?

时间:2019-05-15 11:06:51

标签: mysql join optimization

我了解到,当我们在mysql中使用join(左联接或右联接,而不是内部联接)语句时,mysql将生成笛卡尔乘积作为临时表。

但是有人告诉我,如果on语句中使用的列具有索引, 不会生成笛卡尔积。

我不确定他是否正确,因为我找不到有关此事的文章或手册。是他吗?

顺便说一句,有人告诉我不要在生产环境中使用join语句,因为它可能存在潜在的问题。但是我认为使用join完全没有害处。而且,如果我们仔细优化sql,我们将不必担心性能问题。我们应该禁止在生产环境中使用join吗?谢谢。

1 个答案:

答案 0 :(得分:1)

只要您有CROSS JOIN,包括JOINLEFTRIGHT,而没有{ {1}}子句或INNER子句中的等效内容。

任何类型的ON可能会或可能不会生成临时表。而且它可能会或可能不会撞到磁盘。

WHERE在生产中。当然。一个索引良好的查询(等)非常快。而且,当您需要JOIN时,其他选择(如果有的话)可能会更糟。

理论的角度来看,这样执行JOINs

  1. 创建笛卡尔积。
  2. 扔掉任何不符合JOINJOIN限制的行。
  3. 移至ONWHEREGROUP BYHAVING

真实性中,优化器采用了所有可以想到的捷径。典型的ORDER BY更像这样:

  1. 浏览一张表,过滤掉与LIMIT不匹配的所有行。
  2. 使用索引到达连接的表以在其中找到0或1或几行。名称:NLJ-嵌套循环联接
  3. 抛弃所有与其他JOINWHERE限制不匹配的 more 行。

对于ONWHERE来说,除非 不用,否则就不要使用它们,除非您需要获得结果行“左”表。它使用户感到困惑,并使优化程序更加难以确定您的意思LEFT

在MySQL中,关键字RIGHTINNER JOIN实际上被忽略。合适的INNEROUTER的存在控制着ON的类型。