我有以下查询来返回不在message_log表中的用户ID
select * from likes where userid not in(select to_id from message_log)
我在likes表中的userid列上有一个索引,在message_log表中有一个to_id列的索引,但根据EXPLAIN没有使用索引。我的查询有问题吗?我的查询已经运行了20分钟,仍然没有结果。
答案 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子句中删除星号(如我的例子中所示),因为它可能会影响优化器使用的索引。