2013-04-18 4 views
0

이 조정이 가능한지 조언 해주십시오.SQL 쿼리 속도를 높이는 방법

테이블 :

CREATE TABLE UTIL_DAY (
    CompID varchar(15) collate utf8_czech_ci NOT NULL, 
    TestplanID int(10) unsigned NOT NULL default '0', 
    FromDate datetime NOT NULL default '0000-00-00 00:00:00', 
    ToDate datetime NOT NULL default '0000-00-00 00:00:00', 
    Interval int(11) NOT NULL default '0', 
    Variant varchar(25) collate utf8_czech_ci default NULL, 
    WO_ID int(11) default NULL, 
    SAPTime int(5) default NULL, 
    UseTime int(5) NOT NULL, 
    MeasureCount int(10) unsigned NOT NULL, 
    KEY CompID (CompID), 
    KEY TestplanID (TestplanID), 
    KEY WO_ID (WO_ID), 
    KEY FromDate (FromDate), 
    KEY Variant (Variant) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 

현재 쿼리

UPDATE UTIL_DAY UDAY SET TestplanID = (SELECT TestplanID 
             FROM (SELECT UD_U.Variant,UD_U.WO_ID,VS.TestplanID 
              FROM (SELECT UD.Variant,UD.WO_ID 
                FROM UTIL_DAY UD WHERE SUBSTR(CompID,1,3) <> 'AOI' 
                GROUP BY UD.Variant,UD.WO_ID) UD_U 
              JOIN VARIANTS V ON UD_U.Variant = V.Variant 
              JOIN VARIANT_STATUS VS ON V.VariantID = VS.VariantID 
              JOIN TESTPLANS_WO_ID TW ON UD_U.WO_ID = TW.WO_ID 
              WHERE VS.TestplanID = TW.TestplanID 
              GROUP BY UD_U.Variant,UD_U.WO_ID) TP 
             WHERE TP.Variant = UDAY.Variant AND TP.WO_ID = UDAY.WO_ID) 

그리고 내 업데이트는 임시 테이블에 있습니다 :

CREATE TEMPORARY TABLE UTIL_DAY_TEMP (
Variant varchar(25) COLLATE 'utf8_czech_ci' NOT NULL, 
WO_ID int unsigned NOT NULL, 
TestplanID int unsigned NOT NULL, 
PRIMARY KEY Variant_WO_ID (Variant, WO_ID)) COMMENT='' ENGINE='InnoDB' COLLATE 'utf8_czech_ci'; 
INSERT IGNORE INTO UTIL_DAY_TMP (SELECT UD_U.Variant,UD_U.WO_ID,VS.TestplanID 
       FROM (SELECT UD.Variant,UD.WO_ID 
      FROM UTIL_DAY UD WHERE SUBSTR(CompID,1,3) <> 'AOI' 
      GROUP BY UD.Variant,UD.WO_ID) UD_U 
     JOIN VARIANTS V ON UD_U.Variant = V.Variant 
     JOIN VARIANT_STATUS VS ON V.VariantID = VS.VariantID 
     JOIN TESTPLANS_WO_ID TW ON UD_U.WO_ID = TW.WO_ID 
     WHERE VS.TestplanID = TW.TestplanID 
     GROUP BY UD_U.Variant,UD_U.WO_ID); 
UPDATE UTIL_DAY UDAY SET TestplanID = (SELECT TestplanID 
             FROM UTIL_DAY_TEMP TP 
             WHERE TP.Variant = UDAY.Variant AND TP.WO_ID = UDAY.WO_ID); 

이 개선은 400 %로 2milion 행을 통해 쿼리를 가속화. 그러나이 같은 결과는 똑같은 결과입니까? 답변 해 주셔서 감사합니다.

+1

에 복합 인덱스에 대한 설명서를 확인 어떤 인덱스가 당신을 도울 것입니다 경우 그 후

, 파악 양의 데이터를 무작위로 추출한 다음 두 쿼리 모두에서 동일한 결과를 얻었습니까? – Patashu

답변

0

첫째, MySQL의에서

EXPLAIN 명령을 사용합니다. 거대한를 삽입하는 단위 테스트를 작성하지 이유 : (통제 불능 인덱스를 생성하지 않는 경고) 또한 , MySQL의

관련 문제