2011-11-29 63 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被聲明爲數字那麼他們不應該被引用。