mysql 为什么INNER JOIN不相等(!=)hang forever

xzlaal3s  于 2023-04-28  发布在  Mysql
关注(0)|答案(4)|浏览(191)

当我执行以下查询时:

  1. SELECT * FROM `table1`
  2. INNER JOIN table2 ON table2.number = table1.number

我在2秒内得到结果。table2中有大约600万条记录,table1中有100万条记录
table2.numbertable1.number被索引。
现在我想得到一个不存在的数字列表。就像这样:

  1. SELECT * FROM `table1`
  2. INNER JOIN table2 ON table2.number != table1.number

它需要永远,仍然挂着。.如何修复?

pbwdgjma

pbwdgjma1#

假设您的第一个INNER JOIN返回table1中1,000,000行的75%。第二个查询并不像您想象的那样返回其他250,000行。相反,它尝试创建笛卡尔积并删除750,000个匹配行。因此,它试图返回6,000,000 × 1,000,000 - 750,000行。这是一个膨胀的6×1012行结果集。
你可能想要这个:

  1. SELECT * FROM table1
  2. LEFT JOIN table2 ON table2.number = table1.number
  3. WHERE table2.number IS NULL

这将返回table1中不存在的行。
您可能也对FULL OUTER JOIN感兴趣:

  1. SELECT * FROM table1
  2. FULL OUTER JOIN table2 ON table2.number = table1.number
  3. WHERE table1.number IS NULL AND table2.number IS NULL

这将返回两个表中另一个表中没有匹配项的行。

展开查看全部
gfttwv5a

gfttwv5a2#

这不起作用的原因是因为你基本上将表1的每一行与表2的每一行连接起来。你需要一些东西来连接它。最好的方法是执行左连接(这意味着无论如何它都会连接表1,但不会连接表2),然后检查以确保表2没有为空的条目。然后,您需要对表2执行相同的操作。

  1. SELECT * FROM `table1`
  2. LEFT JOIN table2 ON table2.number = table1.number
  3. WHERE table2.number is NULL
  4. UNION
  5. SELECT * FROM `table2`
  6. LEFT JOIN table1 ON table2.number = table1.number
  7. WHERE table1.number is NULL
i1icjdpr

i1icjdpr3#

你可以使用这个方法:

  1. SELECT * FROM `table1`
  2. LEFT JOIN table2 ON table2.number = table1.number
  3. WHERE
  4. table2.number is NULL OR table1.number is NULL
ncgqoxb0

ncgqoxb04#

@Álvaro González当我们希望返回不匹配的记录时,完整的外部连接查询是否应该使用OR而不是AND:而不是永远不会返回任何记录。

  1. SELECT * FROM table1
  2. FULL OUTER JOIN table2 ON table2.number = table1.number
  3. WHERE table1.number IS NULL OR table2.number IS NULL

相关问题