亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用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 關注
  • 2140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號