从大型数据集中过滤出记录的最佳方法是什么

时间:2019-04-03 06:06:12

标签: mysql sql

我在一个表中有大约500,000个用户记录,而另一个表中包含被其他用户明确阻止的用户(即哪个用户阻止了哪个用户)的记录。我正在使用以下查询来筛选当前用户的用户记录,这些用户记录不包含来自被阻止表的被阻止用户。

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

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

3 个答案:

答案 0 :(得分:2)

分别在iduserid列上创建索引,因此子查询和查询都将运行得更快。

此外,我建议稍作修改:

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;