2017-05-25 30 views
0

我有一個三列的表 - appname,uid,rating。 我需要快速獲得每個appname的平均評分。這是我的代碼:避免在平均組中使用臨時組

SELECT 
    t1.appname as applicationName, 
    Avg(t1.rating) as averageRating 
FROM 
    `user_ratings` t1 
GRO 
    t1.appname 

的問題是,我的嵌入式服務器上這需要幾秒鐘,而如果在/ tmp填滿,甚至可能會失敗(我不能做這個事情,我也可以」編輯my.cfg)。所以我想這樣做而不使用臨時的。

下面是解釋輸出,示出作爲預期TMP用於:

1 SIMPLE t1 ALL 6399 Using temporary; Using filesort

沒有平均,查詢瞬間完成,併產生這個說明:

1 SIMPLE t1 index appname 452 6399 Using index

回答

1
INDEX(appname, rating) 

這是最佳的GROUP BY,它是「覆蓋」 - 也就是說,所有的查詢所需的數據索引,無需將手伸入「數據」(這是一個單獨BTree)。

分區會不是幫助。

+0

完美地工作,謝謝。我必須閱讀涵蓋索引。 – Klocman

+0

我在他們的快速討論:http://mysql.rjweb.org/doc.php/index1加一個更長的「菜譜」:http://mysql.rjweb.org/doc.php/index_cookbook_mysql –

0

查詢的「重」部分是GROUP BY

嘗試設置應用程序名稱作爲主索引或按此字段進行分區。

+0

Appname具有重複項,並且不能作爲主項,而我沒有分區插件(舊版本的MySQL)。 – Klocman