为了账号安全,请及时绑定邮箱和手机立即绑定

使用ORDER BY时查询速度慢

使用ORDER BY时查询速度慢

繁星点点滴滴 2019-11-19 10:04:47
这是查询(最大的表约有40,000行)SELECT  Course.CourseID,  Course.Description,  UserCourse.UserID,  UserCourse.TimeAllowed,  UserCourse.CreatedOn,  UserCourse.PassedOn,  UserCourse.IssuedOn,  C.LessonCntFROM  UserCourseINNER JOIN  CourseUSING(CourseID)INNER JOIN(  SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID) CUSING(CourseID)WHERE   UserCourse.UserID = 8810如果运行此命令,它将很快执行(大约.05秒)。它返回13行。当我ORDER BY在查询末尾添加一个子句(按任意列排序)时,查询大约需要10秒钟。我现在正在生产中使用此数据库,并且一切正常。我所有其他查询都很快。有什么想法吗?我在MySQL的查询浏览器中并从命令行运行了查询。两个地方都死了ORDER BY。编辑: Tolgahan ALBAYRAK解决方案有效,但是谁能解释为什么它有效?
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

也许这会有所帮助:


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


查看完整回答
反对 回复 2019-11-19
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您从“ UserCourse ” 中选择,我认为这是课程和用户(多对多)之间的联接表。您应该在“ UserCourse”表中索引需要排序的列。

假设您要“ 按CourseID订购 ”,则需要在UserCourse表上对其进行索引。

通过联接表中不存在的任何其他列(即UserCourse)进行排序可能需要进一步对规范化和联接表上的索引进行优化,以提高速度。换句话说,您需要在联接表中具有该列的副本并为其建立索引。

PS Tolgahan Albayrak给出的答案虽然对这个问题是正确的,但在进行“ LIMIT x”查询的情况下,不会产生期望的结果。


查看完整回答
反对 回复 2019-11-19
  • 3 回答
  • 0 关注
  • 2073 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信