【发布时间】:2020-12-02 03:40:01
【问题描述】:
在 mysql v8.x 中,我有一个包含大约 7000 条记录的表。我正在尝试创建一个查询组合同一个表的两个子查询。
我认为我可以通过左连接子查询然后匹配具有这些值的任何记录来实现这一点,如下例所示(注意:当my_table 只有一个 id 列时会发生这种效果)。
当子查询返回记录时,查询似乎运行得很快,但当子查询返回空时(我在下面的示例中使用WHERE FALSE 重新创建了),查询似乎运行得很快。发生这种情况时,会自行执行这些查询,每个查询需要一毫秒左右,需要 12 秒。
我的理解是这些连接应该返回与源表相同的行数,因此不应该有这么大的差异。我有兴趣了解连接在这种情况下是如何工作的,以及为什么它会在执行时间上产生如此大的差异。
SELECT my_table.* FROM accessory_requests
LEFT JOIN
( SELECT my_table.id
FROM my_table
WHERE FALSE
) as join1
ON join1.id = my_table.id
LEFT JOIN
( SELECT my_table.id
FROM my_table
WHERE FALSE
) as join2
ON join2.id = my_table.id
WHERE join1.id IS NOT NULL OR join2.id IS NOT NULL;
【问题讨论】:
-
我从未见过以 5.8 开头的 MySQL 版本。此外,您的查询在语法上不正确,因为未定义
my_table。而且您的两个联接是相同的,因此它们看起来是多余的。 -
您实际上并不需要派生表,只需将内部查询的 where 条件移动到连接条件中即可。
-
@GordonLinoff 我的错。 mysql 应该已经阅读了 8.x,但我忘记添加一些上下文来解释为什么我在子查询中设置
WHERE FALSE。 my_table 只是一个示例,我假设它会发生在任何表上,因为它只是使用 ids 的查询。 -
@Strawberry 据我了解,这是问题的一个最小示例(生产中的真正子查询包含连接等,但没有它们就会出现问题)我试图缩小我缺乏的地方对连接的具体理解。还有什么我遗漏的东西可能会影响这里的表现吗?
标签: mysql sql performance join left-join