我正在处理的应用程序的一部分是“待办事项列表”,其中显示了用户需要处理的记录。需要使记录显示在此列表中的一组条件之一是另一个表中没有相应的记录。
到目前为止,从我的阅读和实验来看,有三种潜在的方法可以实现此目的:
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,并在表2中没有对应记录的情况下使用null值。在table2_id上有一个索引,我需要的查找非常快;不幸的是,我认为这种解决方案将更加难以管理。这是一个合理的方法吗?
在table2中查找所有不匹配的记录的唯一方法是比LEFT JOIN更快的方法是将行的“存在”缓存在某处。您提到了用于此目的的辅助表,尽管在table1上添加索引的布尔值列肯定会更快。
这种方法的问题与缓存时经常发生的问题相同,即:
如果这些都不是您的问题,或者比使用LEFT JOIN的问题少,那么请务必-继续执行此操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句