[英]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.