提高子查询速度
问题描述:
该查询运行速度缓慢,并且随着表的增长而变慢。任何人都可以找到一种方法来提高速度?提高子查询速度
它旨在用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)
答
这是查询的等价版本,我觉得更容易阅读:
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
上的索引仍然有帮助。
否加入条件?非常意外。 – jarlh
简单的JOIN会加快它的速度...... – Veljko89
你用这个'INSERT'完成了什么工作? –