提高子查询的速度
Increase speed of subquery
此查询运行缓慢,并且随着 table 的增长而变慢。谁能找到提高速度的方法?
它旨在用 tblUser 和 tblLesson 的 ID 填充 tblUser_Lesson,同时确保插入前 table 中不存在该 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
上的索引仍然有帮助。
此查询运行缓慢,并且随着 table 的增长而变慢。谁能找到提高速度的方法?
它旨在用 tblUser 和 tblLesson 的 ID 填充 tblUser_Lesson,同时确保插入前 table 中不存在该 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
上的索引仍然有帮助。