0

嘿。你將如何優化這個SQLRails/mysql SUM不同記錄 - 優化

SELECT SUM(tmp.cost) FROM (
    SELECT DISTINCT clients.id as client, countries.credits_cost AS cost 
    FROM countries 
    INNER JOIN clients ON clients.country_id = countries.id 
    INNER JOIN clients_groups ON clients_groups.client_id=clients.id 
    WHERE clients_groups.group_id IN (1,2,3,4,5,6,7,8,9) 
    GROUP BY clients.id 
) AS tmp; 

我使用這個例子作爲我的Ruby on Rails項目的一部分。請注意,我的嵌套SQL(tmp)可以有超過1000萬條記錄。如果性能更好,您可以將其拆分爲更多的SQL。 我應該添加任何索引以使其更快(我擁有ID)嗎?

+0

你能解釋一下這個查詢應該做什麼嗎?這非常奇怪,因爲A)DISTINCT clients.id在這種情況下似乎並不意味着任何東西,事實上,選擇clients.id的必要性並不明顯,B)您正在按clients.id進行分組,這意味着您只會從第一個國家獲得成本,但沒有訂單,因此您將基本上爲每個客戶端獲得一個任意國家。 – gtd 2010-04-04 21:26:35

+0

內部SQL具有DISTINCT屬性以消除所有clients.id重複。 SQL的作品,但我正在尋找優化建議。 – xpepermint 2010-04-05 12:26:14

回答

1

您應該對參與這個SQL代碼,所有的外鍵指標如: clients_groups.client_id,clients.country_id,clients_groups.group_id

然而,主要 當你有多個條目,使用SQL函數(如SUM()或COUNT())可能會導致性能下降 因此,我建議您保留成本緩存並使用影響成本的每個事務對其進行更新。