我了解到,当我们在mysql中使用join(左连接或右连接,而不是内部连接)语句时,mysql将生成一个笛卡尔产品作为临时表。
但是有人告诉我,如果在on 语句中使用的列有索引,那么就不会生成笛卡尔产品.
我不确定他是否是对的,因为我找不到文章或手册谈论它。是他说的对吗?
顺便说一下,有人告诉我不要在生产环境中使用join语句,因为它可能存在潜在的问题。但我认为使用join并不会有什么害处。如果我们仔细优化sql,我们就不会担心性能问题。我们应该禁止在生产环境中使用join吗?谢谢。
发布于 2019-05-17 04:33:58
笛卡尔乘积,又名CROSS JOIN,每当您有一个JOIN (包括LEFT、RIGHT和INNER )时,就会发生,而没有ON子句或WHERE子句中的等价物。
任何类型的JOIN都可以生成临时表,也可以不生成临时表。它可能击中磁盘,也可能不击中磁盘。
生产中的JOINs。好的。索引良好的查询(等)非常快速。而且,当您需要一个JOIN时,可能会有更糟的替代方案。
从理论的角度来看,JOIN是这样执行的:
ON和WHERE限制不匹配的行。GROUP BY、HAVING、ORDER BY和LIMIT。在现实中,优化者采取了它能想到的所有捷径。一个典型的JOIN更像这样:
WHERE不匹配的任何行。ON和WHERE限制不匹配的行。至于LEFT和RIGHT --除非您需要获得结果行,否则不要使用它们,即使该行分别从“右”或“左”表中丢失。它混淆了用户,并使优化器更加努力地工作,以确定您真正指的是INNER JOIN。
在MySQL中,关键字INNER和OUTER基本上被忽略了。适当的ON或WHERE的存在控制着它是哪种类型的JOIN。
https://stackoverflow.com/questions/56147876
复制相似问题