嵌套优化MySQL查询不存在吗?

时间:2014-11-03 12:13:01

标签: mysql query-optimization

我列出了属于小组(课堂)的学生所做的练习提交,其中包含:

 submission table: userId, groupId, exercise_id (and more irrelevant data)
 users table: userId, groupId

我想选择特定小组中所有学生完成的所有练习。为此,我目前有:

SELECT DISTINCT(exercise_id) FROM submissions as c1 WHERE c1.groupId = 1 
AND NOT EXISTS(
    SELECT DISTINCT(UserId) FROM users as u WHERE u.GroupId = 1 
    AND NOT EXISTS (
        SELECT exercise_id FROM submissions as c2 WHERE u.UserId = c2.UserId 
        AND c2.exercise_id = c1.exercise_id
    )
)

即。我选择了组中没有用户的所有练习。

但是,此查询在具有150万行的提交表上花费5秒。我可以采取哪些步骤来进一步优化此查询?我考虑过内部联接,但这不会导致相同的查询执行计划吗?

1 个答案:

答案 0 :(得分:2)

groupid真的不应该在两个表中。假设值一致,请尝试以下操作:

select s.exercise_id
from submissions s
where s.groupid = 1
group by s.exercise_id
having count(distinct userid) = (select count(distinct userid) from users where groupid = 1);

对于性能,您需要submissions(groupid, exercise_id)上的索引。此外,如果您知道没有重复的提交或用户,请删除distinct,因为这会对性能产生负面影响。