2016-04-27 131 views
3

該查詢運行速度緩慢,並且隨着表的增長而變慢。任何人都可以找到一種方法來提高速度?提高子查詢速度

它旨在用tblUser和tblLesson的id填充tblUser_Lesson,同時確保在插入之前表中的id不存在。

我有一個關於tblUser.name和tblLesson.name的索引,但它似乎沒有什麼區別。

INSERT INTO tblUser_Lesson (user, lesson) 
    SELECT userId, lessonId 
    FROM 
    (
     SELECT tblUser.id userId, tblLesson.id lessonId 
     FROM tblUser, 
      tblLesson 
     WHERE tblUser.name=? 
     AND tblLesson.name=? 
) tmp 
    WHERE NOT EXISTS (SELECT user 
        FROM tblUser_Lesson tmp1 
        WHERE tmp1.user = tmp.userId 
         AND tmp1.lesson = tmp.tblLesson) 
+0

否加入條件?非常意外。 – jarlh

+0

簡單的JOIN會加快它的速度...... – Veljko89

+1

你用這個'INSERT'完成了什麼工作? –

回答

6

這是查詢的等價版本,我覺得更容易閱讀:

INSERT INTO tblUser_Lesson(user, lesson) 
    SELECT userId, lessonId 
    FROM tblUser u CROSS JOIN 
     tblLesson l 
    WHERE u.name = ? AND l.name = ? AND 
      NOT EXISTS (SELECT 1 
         FROM tblUser_Lesson ul 
         WHERE ul.user = u.userId AND ul.lesson = l.tblLesson 
        ); 

我的第一個建議是讓數據庫做的工作。在tblUser_Lesson創建唯一索引:

create unique index unq_tblUser_Lesson on tblUser_Lesson(UserId, Lesson); 

然後,只需做作爲插入:

INSERT INTO tblUser_Lesson(user, lesson) 
    SELECT userId, lessonId 
    FROM tblUser u CROSS JOIN 
     tblLesson l 
    WHERE u.name = ? AND l.name = ? ; 

其次,我會爲其他每個表的創建索引:

create index idx_tbluser_name_id on tblUser(name, id); 
create index idx_tblLesson_name_id on tblLesson(name, id); 

,可以加速這個查詢。

如果您(一般情況下)不想在出現重複時發生錯誤,那麼您可以保留NOT EXISTS條款。 tblUser_Lesson上的索引仍然有幫助。

+2

很好的解釋,我喜歡它 – Veljko89

+0

你釘住了@Gordon。很好的答案。我改進了查詢語法並削減了插入速度。謝謝!! – Ninja3412