2013-05-20 1 views
0
국가에서

내가 AGG_MENTION, LOCATIONDM, CITYDM 테이블에서 40000 ~ 50000 레코드가와 쿼리를 최적화 인덱스

SELECT aggsm.topicdm_id AS topid,citydm.city_name 
FROM AGG_MENTION AS aggsm 
JOIN LOCATIONDM AS locdm ON aggsm.locationdm_id = locdm.locationdm_id 
JOIN CITY AS citydm ON locdm.city_id = citydm.city_id 
JOIN STATE AS statedm ON citydm.state_id = statedm.state_id 
JOIN COUNTRY AS cntrydm ON statedm.country_id = cntrydm.country_id 
WHERE cntrydm.country_id IN (1,2,3,4) 
GROUP BY aggsm.topicdm_id,aggsm.locationdm_id 
LIMIT 0,200000 

테이블에서 40000 개 레코드를 1.6 초 복용 MySQL의 쿼리 .... 500records STATEDM에서 ABD 4 개 기록 표. 내가 거기 열 성능 .... 다음을 향상시킬 수있는 쿼리 나 인덱스를 최적화 할 수있는 방법을 1.6 sec..Is 복용 쿼리 이상 실행하면 EXPLAIN 출력 :

1 SIMPLE aggsm index agg_sm_locdm_fk_idx agg_sm_datedm_fk_idx 4  36313 Using index; Using temporary; Using filesort 
    1 SIMPLE locdm eq_ref PRIMARY,city_id_UNIQUE,locationdm_id_UNIQUE,loc_city_fk_idx PRIMARY 8 opinionleaders.aggsm.locationdm_id 1 
    1 SIMPLE citydm eq_ref PRIMARY,city_id_UNIQUE,city_state_fk_idx PRIMARY 8 opinionleaders.locdm.city_id 1 
    1 SIMPLE statedm eq_ref PRIMARY,state_id_UNIQUE,state_country_fk_idx PRIMARY 8 opinionleaders.citydm.state_id 1 Using where 
    1 SIMPLE cntrydm eq_ref PRIMARY,country_id_UNIQUE PRIMARY 8 opinionleaders.statedm.country_id 1 Using index 

답변

1

나는 것 쿼리의 역순으로 시작하여 먼저 조건을 기반으로하는 상태로 시작하십시오. 당신이 실제로 (국가 ID 제외) 국가 테이블 작업을 수행하지 않는 때문에 ...이 열은 상태 테이블에 존재하는, 그래서 당신은 State.Country_ID 및 조인에서 국가 테이블을 제거 할 수 있습니다.

또한, 나는 인덱스의 일환으로 "CITY_NAME"을 가짐으로써 다음 인덱스

Table   Index 
State   (Country_ID) as that will be basis of your WHERE criteria. 
City   (State_ID, City_Name). 
Location  (City_ID) 
Agg_Mention (LocationDM_ID, TopicDM_id). 

있을 것 쿼리는 실제 페이지 데이터에 갈 필요가 없습니다. 색인의 일부로 직접 사용할 수 있습니다.

여러 번, 여기에 포함 된 "STRAIGHT_JOIN"키워드는 명시된 순서대로 쿼리를 실행하는 데 최적화 프로그램이 도움이되므로 다른 테이블 중 하나를 데이터 쿼리의 기본 기본으로 사용하지 않습니다. 문제가 해결되지 않으면 다시 시도해보십시오.

SELECT STRAIGHT_JOIN 
     aggsm.topicdm_id AS topid, 
     citydm.city_name 
    FROM 
     STATE AS statedm 
     JOIN CITY AS citydm 
      ON statedm.state_id = citydm.state_id 
       JOIN LOCATIONDM AS locdm 
        ON citydm.city_id = locdm.city_id 
        join AGG_MENTION AS aggsm 
         ON locdm.locationdm_id = aggsm.locationdm_id 
    WHERE 
     statedm.country_id IN (1,2,3,4) 
    GROUP BY 
     aggsm.topicdm_id, 
     aggsm.locationdm_id 
    LIMIT 0,200000 
+0

감사 DRapp. 좋은 나를 위해 학습 ...하지만 난 임시 filesort를 사용하는 위의 쿼리 ... statedm에 EXPLAIN 실행할 때 나는 질문 .... ... 어떻게 우리의 ... – Sarath

+0

@Sarath 제거 할 수있다, 첫 번째 위치에있는 단지 (country_ID)에 대한 그 인덱스, 또는 적어도 country_id을해야합니까? 내가 열 순서가 가장 가까운 쿼리의 기준이 일치하는 것으로 나타났습니다하면보다 효율적으로 최적화 할 수 있습니다. – DRapp

+0

I는 제 위치에 country_id 인덱스 .. 1 SIMPLE \t \t \t statedm 인덱스 \t PRIMARY, state_id_UNIQUE, state_country_fk_idx가 어디에 사용 state_country_fk_idx \t \t \t \t 8 69 \t을 country_idx; 색인 사용; 임시 사용; 인덱스에 확인 filesort – Sarath

관련 문제