MySQL:快速查找另一个表中没有相应行的行

时间:2011-09-06 12:06:27

标签: mysql performance

我在MySQL中有两个相关的表。我想在表A中找到没有相应行表B的行。这里的手册和其他线程推荐这样做:

SELECT a.id
  FROM a LEFT JOIN b ON a.id = b.a_id
  WHERE b.id IS NULL;

但是,这很慢。在我的例子中,表A的行少于5000行,表B的行数约为40000,但此查询最多需要8分钟。

有人知道如何更快地实现这一目标吗?

非常感谢, 亚光

编辑:索引是问题所在。创建一个后,查询将在10微秒内运行。

3 个答案:

答案 0 :(得分:5)

  1. a_id表格
  2. 中的索引覆盖b字段
  3. WHERE b.id IS NULL替换为WHERE b.a_id IS NULL

答案 1 :(得分:2)

SELECT a.id
FROM a 
WHERE NOT EXISTS (
    SELECT *
    FROM b
    WHERE a.id = b.a_id
)

当然,你应该在b.a_id

上有一个索引

答案 2 :(得分:1)

通过检查外键列是否为空而不是(它不会解释那么慢),你可以稍快一点:< / p>

SELECT a.id
FROM a
LEFT JOIN b ON a.id = b.a_id
WHERE b.a_id IS NULL;

如果这没有用,请试试这个:

create index b_a_id on b(a_id);