我在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微秒内运行。答案 0 :(得分:5)
a_id
表格b
字段
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);