首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用mysql时,“”每次都生成笛卡儿产品吗?

问在使用mysql时,“”每次都生成笛卡儿产品吗?
EN

Stack Overflow用户
提问于 2019-05-15 11:06:51
回答 1查看 553关注 0票数 1

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

但是有人告诉我,如果在on 语句中使用的列有索引,那么就不会生成笛卡尔产品.

我不确定他是否是对的,因为我找不到文章或手册谈论它。是他说的对吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 04:33:58

笛卡尔乘积,又名CROSS JOIN,每当您有一个JOIN (包括LEFT、RIGHT和INNER )时,就会发生,而没有ON子句或WHERE子句中的等价物。

任何类型的JOIN都可以生成临时表,也可以不生成临时表。它可能击中磁盘,也可能不击中磁盘。

生产中的JOINs。好的。索引良好的查询(等)非常快速。而且,当您需要一个JOIN时,可能会有更糟的替代方案。

从理论的角度来看,JOIN是这样执行的:

  1. 创建笛卡尔产品。
  2. 抛出与ON和WHERE限制不匹配的行。
  3. 转到GROUP BY、HAVING、ORDER BY和LIMIT。

在现实中,优化者采取了它能想到的所有捷径。一个典型的JOIN更像这样:

  1. 扫描一个表,筛选出与WHERE不匹配的任何行。
  2. 使用索引进入联接表,查找0行、1行或数行。名称: NLJ -嵌套循环连接
  3. 抛出更多与ON和WHERE限制不匹配的行。
  4. 等。

至于LEFT和RIGHT --除非您需要获得结果行,否则不要使用它们,即使该行分别从“右”或“左”表中丢失。它混淆了用户,并使优化器更加努力地工作,以确定您真正指的是INNER JOIN。

在MySQL中,关键字INNER和OUTER基本上被忽略了。适当的ON或WHERE的存在控制着它是哪种类型的JOIN。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56147876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档