我在一个表中有大约500,000个用户记录,而另一个表中包含被其他用户明确阻止的用户(即哪个用户阻止了哪个用户)的记录。我正在使用以下查询来筛选当前用户的用户记录,这些用户记录不包含来自被阻止表的被阻止用户。
SELECT * from demouser where id not in (select blockedid from demoblock where userid = 1 )
这很慢,执行查询大约需要2秒钟。有没有更有效的方法来过滤记录,而无需将500,000条用户记录与阻止的表进行比较以从结果中删除阻止的用户?
答案 0 :(得分:2)
分别在id
和userid
列上创建索引,因此子查询和查询都将运行得更快。
此外,我建议稍作修改:
select * from demouser du
where not exists(select 1 from demouser
where blockedid = du.id
and userid = 1)
答案 1 :(得分:2)
我将其写为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)
上建立索引。
答案 2 :(得分:1)
假设您的demoblock
表中没有很多数据,则可以尝试使用INNER JOIN
。下面的查询示例:
SELECT * FROM demouser INNER JOIN demoblock ON demouser.id=demoblock.id WHERE demoblock.id=1;