此查询过去需要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秒才能完成此查询。有人可以帮我优化/重构吗?提前谢谢。
答案 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更快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被声明为数字,则不应引用它们。