簡體   English   中英

為什么我的 INNER JOIN 這么慢? 服務器超時

[英]Why is my INNER JOIN so slow? Server times out

我相對簡單的查詢執行時間太長,以至於服務器超時。 順便說一句,如果我自己運行子查詢,它執行得非常快。

本質上,我試圖獲取每個 game_id 的第一個日期,然后獲取相應的分數和持續時間...

我的查詢:

SELECT 
    sq.*, 
    up.score AS score, 
    up.duration AS duration 
FROM (
    SELECT 
        up.uid AS uid, 
        up.lesson_id AS lesson_id, 
        up.level AS level, 
        up.game_id AS game_id, 
        MIN(up.date) AS first_date
    FROM cdu_user_progress up
    WHERE (up.score >= '0') 
    GROUP BY up.uid, up.lesson_id, up.level, up.game_id
) sq
INNER JOIN cdu_user_progress up ON up.uid = sq.uid AND up.lesson_id = sq.lesson_id AND up.level = sq.level AND up.game_id = sq.game_id AND up.date = sq.first_date
GROUP BY sq.uid, sq.lesson_id, sq.level, sq.game_id

cdu_user_progress 是:

------------------------------------------------------------------------------------
|id    |uid    |lesson_id    |game_id    |level    |score    |duration    |date    |
------------------------------------------------------------------------------------

解釋:

Field      Type     Null    Key     Default     Extra
--------------------------------------------------------------
id         int(11)  NO      PRI     NULL        auto_increment
uid        int(11)  NO      NULL     
lesson_id  int(11)  NO      NULL     
game_id    int(11)  NO      NULL     
level      int(11)  NO      NULL     
score      int(11)  NO      NULL     
duration   int(11)  NO      NULL     
date       int(11)  NO      NULL     

首先,我認為您不需要外部group by ,除非您按日期有重復項。 如果是這樣,也許您可​​以使用id代替date或除了date

SELECT sq.*, up.score AS score,  up.duration AS duration 
FROM (SELECT up.uid, up.lesson_id, up.level, up.game_id,
             MIN(up.date) AS first_date
      FROM cdu_user_progress up
      WHERE up.score >= 0 
      GROUP BY up.uid, up.lesson_id, up.level, up.game_id
      ) s INNER JOIN
      cdu_user_progress up
      ON up.uid = sq.uid AND up.lesson_id = sq.lesson_id AND
         up.level = sq.level AND up.game_id = sq.game_id AND
         up.date = sq.first_date;

此查詢的最佳索引是cdu_user_progress(score)cdu_user_progress(uid, lesson_id, level, game_id, date) 如果第一個查詢運行得很快,那么第二個索引應該會有很大幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM