2013-05-13 2 views
0

그룹 by 및 sum이 포함 된 쿼리가 있습니다. 약 1 백만 개의 레코드가 있습니다. 쿼리를 실행할 때 2.5 초가 걸립니다. 내가 group by 절을 제거하면 0.89를 얻는다. 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 

결과는 다음과 같습니다 설명 : compdm 테이블이 먼저 실행되는 이유

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 

이 또한 내가 이해하지 못했다. 누군가 설명 할 수 있습니까?

나는 ei_uuid, companydm_id, datedm_id의 조합으로 AGG_EXTERNALINDIVIDUAL 테이블에 인덱스를 가지고 있습니다. 가능한 키 밑에있는 aggEI 테이블에 uid_comp_dt_idx로 표시됩니다. 그러나 aggEI 테이블은 datedmid_UNIQUE를 키로 사용하고 있습니다. 나는 그 행동을 이해하지 못했습니다.

누군가 설명 할 수 있습니까?

+0

쿼리 최적화는 내 장점이 아니지만 (companydm_id, datedm_id, topicgroupdm_id, rating)의 복합 인덱스가 도움이 될 것처럼 보입니다. – Strawberry

답변

1

설명 기본 쿼리를 실행하기 전에 종속 쿼리를 실행해야합니다.

AGG_EXTERNALINDIVIDUAL에서 색인 생성을 확인해야합니다.

+0

색인 생성 문제에 대해 두 번째 투표를 추가하고 있습니다. –

+0

어떤 인덱스 조합이 성능을 향상시킵니다. where와 group by 절에서 사용 된 열의 조합에 대한 색인이 있습니다. aggEI.ei_uuid, aggEI.companydm_id, aggEI.datedm_id, aggEI.topicgroupdm_id – Sarath

+0

각 열에 인덱스가 있지만 Explain에는 datedm_id_UNIQUE만을 사용하는 것으로 표시되며 197,865 개의 레코드를 조사합니다. 이 쿼리를 정기적으로 실행하면 한 번에 여러 열에 인덱스를 만들 수 있습니다. – Lawson