首页 > 解决方案 > 从大型数据集中过滤掉记录的最佳方法是什么

问题描述

我在一个表中有大约 500,000 个用户记录,另一个表包含被其他用户特别阻止的用户的记录(即哪个用户阻止了哪个用户)。我正在使用以下查询来过滤当前用户的用户记录,其中不包含来自被阻止表的被阻止用户。

SELECT * from demouser where id not in (select blockedid from demoblock where userid = 1 )

它很慢,执行查询大约需要 2 秒。有没有更有效的方法来过滤记录而不将 500,000 条用户记录与被阻止的表进行比较以从结果中删除被阻止的用户?

标签: mysqlsql

解决方案


我会把它写成not exists

select du.*
from demouser du
where not exists (select 1
                  from demoblock db
                  where db.blockedid = du.id and
                        db.userid = 1
                 );

对于此查询,您需要在demoblock(blockedid, userid).


推荐阅读