我了解到,当我们在mysql中使用join
(左联接或右联接,而不是内部联接)语句时,mysql将生成笛卡尔乘积作为临时表。
但是有人告诉我,如果on
语句中使用的列具有索引,
不会生成笛卡尔积。
我不确定他是否正确,因为我找不到有关此事的文章或手册。是他吗?
顺便说一句,有人告诉我不要在生产环境中使用join
语句,因为它可能存在潜在的问题。但是我认为使用join
完全没有害处。而且,如果我们仔细优化sql,我们将不必担心性能问题。我们应该禁止在生产环境中使用join
吗?谢谢。
答案 0 :(得分:1)
只要您有CROSS JOIN
,包括JOIN
,LEFT
和RIGHT
,而没有{ {1}}子句或INNER
子句中的等效内容。
任何类型的ON
可能会或可能不会生成临时表。而且它可能会或可能不会撞到磁盘。
WHERE
在生产中。当然。一个索引良好的查询(等)非常快。而且,当您需要JOIN
时,其他选择(如果有的话)可能会更糟。
从理论的角度来看,这样执行JOINs
:
JOIN
和JOIN
限制的行。ON
,WHERE
,GROUP BY
和HAVING
。在真实性中,优化器采用了所有可以想到的捷径。典型的ORDER BY
更像这样:
LIMIT
不匹配的所有行。JOIN
和WHERE
限制不匹配的 more 行。对于ON
和WHERE
来说,除非 不用,否则就不要使用它们,除非您需要获得结果行“左”表。它使用户感到困惑,并使优化程序更加难以确定您的意思LEFT
。
在MySQL中,关键字RIGHT
和INNER JOIN
实际上被忽略。合适的INNER
或OUTER
的存在控制着ON
的类型。