mysql - 每次使用mysql时`join`都会生成笛卡尔积吗?
问题描述
我了解到当我们在mysql中使用join
(左连接或右连接,而不是内连接)语句时,mysql会生成一个笛卡尔积作为临时表。
但是有人告诉我,如果on
语句中使用的列有索引,则不会生成笛卡尔积。
我不确定他是否正确,因为我找不到有关它的文章或手册。他说的对吗?
顺便说一句,有人告诉我不要join
在生产环境中使用语句,因为它可能有潜在的问题。但我认为使用join
并没有什么坏处。而且如果我们仔细优化sql,就不用担心性能问题了。我们应该禁止join
在生产环境中使用吗?谢谢你。
解决方案
笛卡尔积,又名,,CROSS JOIN
只要你有一个JOIN
,包括LEFT
,,RIGHT
和INNER
,而没有ON
子句或子句中的等价物,就会发生WHERE
。
临时表可能会或可能不会由任何类型的JOIN
. 它可能会也可能不会击中磁盘。
JOINs
在生产中。当然。索引良好的(等)查询非常快。而且,当您需要 a 时JOIN
,替代品(如果有的话)可能会更糟。
从理论的角度来看,aJOIN
是这样执行的:
- 创建笛卡尔积。
ON
扔掉任何与andWHERE
限制不匹配的行。- 转到
GROUP BY
、HAVING
、ORDER BY
和LIMIT
。
实际上,优化器采用了它所能想到的所有捷径。一个典型JOIN
的更像是这样的:
- 扫描一个表,过滤掉任何不匹配的行
WHERE
。 - 使用索引进入连接表以找到那里的 0 或 1 或几行。名称:NLJ - 嵌套循环连接
- 扔掉任何与其余的和限制不匹配的行。
ON
WHERE
- 等等
至于LEFT
and RIGHT
-- 不要使用它们,除非您需要获取结果行,即使该行分别从“右”或“左”表中丢失。它使用户感到困惑,并使优化器更加努力地确定您的真正意思INNER JOIN
。
在 MySQL 中,关键字INNER
andOUTER
基本上被忽略了。一个合适的存在ON
或WHERE
控制JOIN
它是什么类型。
推荐阅读
- android - 是否可以与 android studio 模拟器上的模拟设备共享本地目录
- android - 如何使用 ChatSDK 对 Firebase 用户进行身份验证?
- ios - 辅助功能 屏幕阅读器在 iPhone X 上有不同的行为
- javascript - 将数组元素分组为 n 组
- javascript - 物化输入字段密码错误标签firefox
- php - 在 PHP 中读取 Socket,只接收 Trash
- java - clone() 方法(浅拷贝或深拷贝)
- javascript - 在 VR 模式下,teleport-controls 在 Aframe 0.8.2 下不起作用
- javascript - jQuery:如果字段为空或未选中复选框,则禁用提交按钮
- c++ - std::stringstream 中双输出的默认格式标志(和宽度)是什么?