查询花了很长时间

时间:2016-03-28 05:15:37

标签: sql postgresql postgresql-performance

我有以下查询来返回不在message_log表中的用户ID

select * from likes where userid not in(select to_id from message_log)

我在likes表中的userid列上有一个索引,在message_log表中有一个to_id列的索引,但根据EXPLAIN没有使用索引。我的查询有问题吗?我的查询已经运行了20分钟,仍然没有结果。

3 个答案:

答案 0 :(得分:2)

select * 
from likes 
     left join message_log ml on ml.to_id=likes.userid
where ml.to_id is null

尝试使用LEFT JOIN进行查询,并保留唯一没有消息的用户ID

答案 1 :(得分:2)

你可以试试这个

select * from likes lk where not exists (select 1 from message_log where to_id = lk.userid )

答案 2 :(得分:1)

首先要考虑的是将子查询转换为连接。像这样:select like.col1, like.col2 from likes like left join message_log mlog on like.userid = mlog.to_id where mlog.to_id is null 虽然优化器很可能会为你做到这一点。

你应该尝试的另一件事是从select子句中删除星号(如我的例子中所示),因为它可能会影响优化器使用的索引。