2011-11-29 62 views
1

此查询过去需要4到5秒才能运行。这里是我的表统计:MySQL不在永久使用

学生表: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秒即可完成此查询。有人可以帮我优化/重构吗?提前致谢。

+2

子查询总是需要时间,请确保您有索引并查看查询的执行计划 –

+0

如果您发布表模式,那就更好了。 –

回答

0

也许你忘了为表创建主要的kays?

+0

我有所有表的主键。 –

+0

它希望在绑定字段上创建索引'students.student_id'' idtrack.event_id' – triclosan

0

EXISTS通常快很多,因为是在你的情况下,它允许MySQL的短路时,发现在idtrack记录违背了NOT EXISTS条款。

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 
) 
+0

在唯一索引字段上的比例为4:1?我会很惊讶。 – symcbean

+0

@symcbean:我没有注意到每个表的记录数。 – flesk

0

什么关于idtrack加入学生和过滤器 “其中students.grade_level = 12,idtrack.event_id <> 33”?加入应该比子查询更快。简单的平等/不平等比“不在”更快。

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 
+0

我试过了,仍然收到缓慢的结果。我结束了使用PHP和数组intesect!谢谢! –

0

在没有看到创建表命令并解释其输出相当困难。但是你可以尝试:

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 

BTW如果idtrack.event_id和students.grade_level被声明为数字那么他们不应该被引用。