2013-10-19 7 views
1

사용자 및 구매에 대한 두 개의 큰 테이블 (각각 10^6 및 10^8 행)이 있습니다. 다음은 mySql을 사용하여 여기에서 쿼리를 실행하지만 계산 시간이 오래 걸립니다! 실행 속도를 높이는 가장 좋은 방법은 무엇입니까? 인덱스를 사용하거나 쿼리를 두 개의 쿼리로 분할해야합니까? 모든 :SQL 그룹 별 및 조인 쿼리 최적화

CREATE TABLE user(
uID INTEGER, 
countryCode varchar(2) 
); 

CREATE TABLE purchases(
uID INTEGER, 
productID INTEGER, 
price INTEGER 
); 

SELECT U.countryCode AS country, SUM(P.price) AS amount 
FROM user U, purchases P 
WHERE U.uid = P.uid 
GROUP BY U.countryCode 
ORDER BY U.countryCode ASC; 

나는 문제가 유형에 같아요. 저에게이 제공 설명해보십시오

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE U ALL  NULL NULL NULL NULL 9653 Using temporary; Using filesort 
1 SIMPLE P ALL  NULL NULL NULL NULL 97816 Using where; Using join buffer 
+1

'countryCode'에 색인을 추가하고'explain select ...'를 실행하여 색인이 더 필요한지 확인하십시오 ('price'도 마찬가지입니다). –

+0

'TEXT'데이터 유형이 필요한 국가 코드는 얼마 동안입니까? –

+0

그냥 몇 글자 ... 그리고 방금 varchar (2)에서 텍스트를 변경했습니다 – user2895890

답변

2

당신은이 두 가지 인덱스를 필요

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: U 
     type: index 
possible_keys: USER_countryCode_uid 
      key: USER_countryCode_uid 
     key_len: 10 
      ref: NULL 
     rows: 10004 
     Extra: Using where; Using index 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: P 
     type: ref 
possible_keys: PURCHASES_uid_price 
      key: PURCHASES_uid_price 
     key_len: 5 
      ref: test.U.uID 
     rows: 1 
     Extra: Using index 

PS :이이 특정 쿼리에 대한 문제가되지 않습니다하지만 당신은 모든 테이블에 대한 기본 키를 정의해야합니다 .

+0

아주 좋아,이게 내가 찾고 있었던거야! 감사 빌. 나는 분명히이 대답에 투표 할 것입니다. – user2895890

1

을이

INDEX countryCode_IDX ON 사용자 (countryCode와)을 생성;

쿼리에서이 인덱스를 사용하십시오.

SELECT U.countryCode AS 나라, 합계 U FORCE INDEX이 (countryCode_IDX) LEFT이 U.uid = P.uid GROUP BY U.countryCode ORDER BY U.에서 구매의 P 가입 USER FROM 금액 AS (P.Price) countryCode ASC;

uid 열에 외래 키 인덱스를 사용하십시오.

CREATE INDEX USER_countryCode_uid ON user(countryCode,uid); 

CREATE INDEX PURCHASES_uid_price ON purchases(uid,price); 

다음 향상 설명해

+0

OP 테이블 (또는 기본 키 중 하나)에 외래 키가 없습니다. –

+0

이 작동하지 않습니다, countryCode_IDX 인덱스 속도를 내고 있지 않습니다. – user2895890