2016-04-27 129 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