2017-09-13 42 views
0

我在下面有一個查詢。通過JOIN GROUP和ORDER BY優化MySQL查詢的任何想法

SELECT `user`.id, title, something, SUM(cnt) AS `total`, 
FROM `user` 
LEFT JOIN `stat_per_day` ON stat_per_day.user_id = user.id 
WHERE CAST(stat_per_day.created_at AS DATE) BETWEEN '2017-08-12' and '2017-09-12' 
GROUP BY `user`.`id` 
ORDER BY `total` DESC 
LIMIT 250; 

這兩張表都有約。 500k條記錄。

stat_per_day結構:

id | created_at | user_id | cnt

我試圖使用索引,但沒有得到加快。 問題是我需要接收任何時期的有序數據。 此外,如果我刪除ORDER BY它運行速度更快,但我需要此訂單。

任何想法? 預先感謝您。

回答

0

下面可能有點幫助:

SELECT u.id, u.title, u.something, 
     (SELECT SUM(spd.cnt) 
     FROM stat_per_day spd 
     WHERE spd.user_id = u.id AND 
       spd.created_at >= '2017-08-12' AND 
       spd.created_at < '2017-09-13' 
     ) AS total 
FROM `user` u 
ORDER BY total DESC 
LIMIT 250; 

stat_per_day(user_id, created_at, cnt)索引將有助於性能。

+0

謝謝,它的工作速度提高了50%。但是如果我需要從stat_per_day獲得更多SUM()列,比如SUM(cnt2)呢?我有一個「操作數應該包含1列」的錯誤,但是做出很多子選擇是很慢的。 – Walkboy

+0

@Walkboy。 。 。你會有一個不同的問題。你可以在'SELECT'中嘗試第二個子查詢。取決於數據,它可能不會對性能產生太大的影響。 –

+0

不幸的是,添加子查詢會導致加速效果。 – Walkboy