2013-05-13 141 views
0

我有一個查詢與分組和總和。我有近100萬條記錄。當我運行查詢時,它需要2.5s。如果我刪除group by子句,它將花費0.89s。有沒有什麼辦法可以使用group by和sum來優化查詢。MySQL groupby與總數

SELECT aggEI.ei_uuid AS uuid,aggEI.companydm_id AS companyId,aggEI.rating AS  rating,aggEI.ei_name AS name, 
compdm.company_name AS companyName,sum(aggEI.count) AS activity 
     FROM AGG_EXTERNALINDIVIDUAL AS aggEI 
     JOIN COMPANYDM AS compdm ON aggEI.companydm_id = compdm.companydm_id 
     WHERE aggEI.ei_uuid is not null 
     and aggEI.companydm_id IN (8) 
     and aggEI.datedm_id = 20130506 
     AND aggEI.topicgroupdm_id IN (1,2,3,4,5,6,7) 
     AND aggEI.rating >= 0 
     AND aggEI.rating <= 100 
GROUP BY aggEI.ei_uuid,aggEI.companydm_id 
LIMIT 0,200000 

解釋結果如下:

1 SIMPLE compdm const PRIMARY,companydm_id_UNIQUE,comp_idx PRIMARY 8  const 1 Using temporary; Using filesort 
    1 SIMPLE aggEI ref  PRIMARY,datedm_id_UNIQUE,agg_ei_comdm_fk_idx,agg_ei_datedm_fk_idx,agg_ei_topgrp_fk_idx,uid_comp_ei_dt_idx,uid_comp_dt_idx,comp_idx datedm_id_UNIQUE 4 const 197865 Using where 

而且爲什麼首先執行compdm表我不明白。有人可以解釋嗎?

我有AGG_EXTERNALINDIVIDUAL表的索引與ei_uuid,companydm_id,datedm_id的組合。在可能的關鍵字uID_comp_dt_idx下的aggEI表中顯示了相同的結果。但是aggEI表正以過時的mid_UNIQUE作爲關鍵。我不明白這種行爲。

有人可以解釋一下嗎?

+0

查詢優化不是我的優勢,但似乎只有(companydm_id,datedm_id,topicgroupdm_id,rating)上的複合索引纔會有幫助。 – Strawberry 2013-05-13 18:17:47

回答

1

說明必須先運行相關查詢,然後才能運行主查詢。

您需要檢查AGG_EXTERNALINDIVIDUAL上的索引。

+0

我爲索引問題添加了第二票。 – 2013-05-13 17:36:08

+0

哪種索引組合會提高性能。我有用於where和group by子句的列的組合索引。 aggEI.ei_uuid,aggEI.companydm_id,aggEI.datedm_id,aggEI.topicgroupdm_id – Sarath 2013-05-13 17:46:07

+0

您在各個列上有索引,但解釋顯示它僅使用datedm_id_UNIQUE,並且它通過197,865條記錄查找。如果此查詢定期運行,則可以一次在多個列上創建索引。 – Lawson 2013-05-13 19:52:37