使用ORDER BY时查询速度慢

这是查询(最大的表约有40,000行)


SELECT

  Course.CourseID,

  Course.Description,

  UserCourse.UserID,

  UserCourse.TimeAllowed,

  UserCourse.CreatedOn,

  UserCourse.PassedOn,

  UserCourse.IssuedOn,

  C.LessonCnt

FROM

  UserCourse

INNER JOIN

  Course

USING(CourseID)

INNER JOIN

(

  SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID

) C

USING(CourseID)

WHERE 

  UserCourse.UserID = 8810

如果运行此命令,它将很快执行(大约.05秒)。它返回13行。


当我ORDER BY在查询末尾添加一个子句(按任意列排序)时,查询大约需要10秒钟。


我现在正在生产中使用此数据库,并且一切正常。我所有其他查询都很快。


有什么想法吗?我在MySQL的查询浏览器中并从命令行运行了查询。两个地方都死了ORDER BY。


编辑: Tolgahan ALBAYRAK解决方案有效,但是谁能解释为什么它有效?


繁星点点滴滴
浏览 2074回答 3
3回答

森栏

也许这会有所帮助:SELECT * FROM (         SELECT      Course.CourseID,      Course.Description,      UserCourse.UserID,      UserCourse.TimeAllowed,      UserCourse.CreatedOn,      UserCourse.PassedOn,      UserCourse.IssuedOn,      C.LessonCnt    FROM      UserCourse    INNER JOIN      Course    USING(CourseID)    INNER JOIN    (      SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID    ) C    USING(CourseID)    WHERE       UserCourse.UserID = 8810) ORDER BY CourseID

明月笑刀无情

您从“ UserCourse ” 中选择,我认为这是课程和用户(多对多)之间的联接表。您应该在“ UserCourse”表中索引需要排序的列。假设您要“ 按CourseID订购 ”,则需要在UserCourse表上对其进行索引。通过联接表中不存在的任何其他列(即UserCourse)进行排序可能需要进一步对规范化和联接表上的索引进行优化,以提高速度。换句话说,您需要在联接表中具有该列的副本并为其建立索引。PS Tolgahan Albayrak给出的答案虽然对这个问题是正确的,但在进行“ LIMIT x”查询的情况下,不会产生期望的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL