是否有更有效的方法来跟踪没有孩子的父记录?

时间:2013-12-31 19:29:21

标签: mysql sql

我正在处理的部分应用程序是一个“待办事项列表”,显示用户需要处理的记录。需要导致记录显示在此列表中的一组标准是另一个表中没有相应的记录。

到目前为止,从我的阅读和实验中,有三种可能的方法来实现这一目标:

SELECT table1.id FROM table1 
LEFT JOIN table2 ON table1.id = table2.t1_id 
WHERE table2.t1_id IS NULL;

SELECT table1.id FROM table1 
WHERE NOT EXISTS (SELECT null FROM table2 
WHERE table2.t1_id = table1.id);

SELECT table1.id FROM table1
WHERE table1.id NOT IN (SELECT table2.t1_id FROM table2);

我已经看到了关于哪一个更有效的各种问题和答案,并且取决于我如何为这两个表设置索引,我可以稍微改变一下,尽管LEFT JOIN似乎是最好的总体。但是我觉得这些表太大了,不能像我这样需要它们一样快。

我的问题是,有没有其他方法可以更有效地完成这项工作?到目前为止,我提出的唯一其他解决方案是创建另一个表,将table1_id映射到零或更多table2_ids,其中null值表table2中没有相应的记录。使用table2_id上的索引,我需要的查找非常快;不幸的是,我认为这个解决方案将更难管理。这是一个合理的方法吗?

1 个答案:

答案 0 :(得分:1)

在表2中找到所有记录但没有匹配LEFT JOIN的唯一方法是在某处缓存某一行的“存在”。你提到了一个用于此目的的辅助表,虽然在table1上添加一个索引的布尔列肯定会更快。

这种方法的问题与缓存时总是会出现的问题相同 - 即:

  • 您需要一种方法来确保此缓存的完整性,并且......
  • 无论您使用哪种方法来确保此完整性(触发器可能是候选者),都需要一些开销处理,从而损害table2上INSERT / UPDATE / DELETE的性能。

如果这些对您来说不是问题,或者比使用LEFT JOIN问题少,那么请务必继续这样做。