【发布时间】:2020-09-24 20:13:53
【问题描述】:
有两个表,products 和 submissions,都有大约 100 万条记录并且完全索引,我想根据条件计算元素。但是,即使计算连接的基本结果也很慢。
这些表具有 1-1 关系,submissions 具有 product_id 外键。请参阅以下 4 个查询:
select count(*)
from products P
join submissions S on S.product_id=P.id
# Takes 2 seconds
并解释该查询:
1 SIMPLE S index submissions_product_id_foreign submissions_product_id_foreign 4 NULL 776660 Using index
1 SIMPLE P eq_ref PRIMARY PRIMARY 4 ma_prod.S.product_id 1 Using index
但是,运行以下查询:
select count(*)
from products P
RIGHT join submissions S on S.product_id=P.id
需要 300 毫秒。解释也不同:
1 SIMPLE S index NULL submissions_product_id_foreign 4 NULL 776662 Using index
我无法理解正在发生的事情。两个查询具有相同的结果并执行相同的连接,那么为什么要跳过 eq_ref 操作呢?此外,eq_ref 在外键上应该是超级快的。
【问题讨论】:
-
请注意,没有人使用 RIGHT JOIN
-
我只是想弄清楚发生了什么。您可以交换表并改为使用 LEFT JOIN,结果相同。
-
好计划。 :-)。
-
结果不同吗?如果是这样,您不能使用一种配方代替另一种。
-
右外连接不太常见,但说它们从未使用过有些夸张。见quora.com/…
标签: mysql sql query-performance outer-join