当我执行以下查询时:
SELECT * FROM `table1`
INNER JOIN table2 ON table2.number = table1.number
我在2秒内得到结果。table2
中有大约600万条记录,table1
中有100万条记录table2.number
和table1.number
被索引。
现在我想得到一个不存在的数字列表。就像这样:
SELECT * FROM `table1`
INNER JOIN table2 ON table2.number != table1.number
它需要永远,仍然挂着。.如何修复?
4条答案
按热度按时间pbwdgjma1#
假设您的第一个
INNER JOIN
返回table1
中1,000,000行的75%。第二个查询并不像您想象的那样返回其他250,000行。相反,它尝试创建笛卡尔积并删除750,000个匹配行。因此,它试图返回6,000,000 × 1,000,000 - 750,000行。这是一个膨胀的6×1012行结果集。你可能想要这个:
这将返回
table1
中不存在的行。您可能也对
FULL OUTER JOIN
感兴趣:这将返回两个表中另一个表中没有匹配项的行。
gfttwv5a2#
这不起作用的原因是因为你基本上将表1的每一行与表2的每一行连接起来。你需要一些东西来连接它。最好的方法是执行左连接(这意味着无论如何它都会连接表1,但不会连接表2),然后检查以确保表2没有为空的条目。然后,您需要对表2执行相同的操作。
i1icjdpr3#
你可以使用这个方法:
ncgqoxb04#
@Álvaro González当我们希望返回不匹配的记录时,完整的外部连接查询是否应该使用OR而不是AND:而不是永远不会返回任何记录。