MySQL不会永远占用

时间:2011-11-29 15:59:31

标签: php mysql sql subquery

此查询过去需要4到5秒才能运行。这是我的表统计数据:

学生表:4200行

idtrack表15000行

这是我的疑问:

SELECT students.student_id
FROM students
WHERE students.grade_level ='12' 
AND students.student_id 
NOT IN (
    SELECT idtrack.student_id
    FROM idtrack
    WHERE idtrack.event_id ='33'
)

现在需要30秒才能完成此查询。有人可以帮我优化/重构吗?提前谢谢。

5 个答案:

答案 0 :(得分:1)

您也可以尝试

SELECT students.student_id
FROM students
LEFT JOIN idtrack ON idtrack.event_id='33' AND idtrack.student_id = students.student_id
WHERE students.grade_level ='12' 
AND idtrack.student_id IS NULL

答案 1 :(得分:0)

也许你忘了为表创建主键?

答案 2 :(得分:0)

EXISTS通常要快得多,因为在你的情况下,当它在idtrack中找到与NOT EXISTS子句相矛盾的记录时,它允许MySQL短路。

SELECT students.student_id
FROM students
WHERE students.grade_level ='12' 
AND NOT EXISTS (
SELECT idtrack.student_id
FROM idtrack
WHERE idtrack.event_id ='33'
AND idtrack.student_id = students.student_id
)

答案 3 :(得分:0)

如何在idtrack上加入学生,并过滤"其中students.grade_level = 12和idtrack.event_id<> 33&#34 ;?加入应该比子查询更快。简单的平等/不平等很多比#34更快

答案 4 :(得分:0)

没有看到create table命令并解释输出相当困难。但你可以试试:

SELECT students.student_id
FROM students LEFT JOIN idtrack
    ON students.id=idtrack.student_id
    AND idtrack.event_id ='33'
WHERE students.grade_level ='12' 
AND idtrack.student_id IS NULL

顺便说一句,如果idtrack.event_id和students.grade_level被声明为数字,则不应引用它们。