2013-04-18 96 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 2013-04-18 06:00:32

回答

0

首先,從MySQL使用

EXPLAIN命令。

之後,計算出,如果任何索引將幫助你(警告:不要創建失控的指標) 此外,檢查複合索引的文檔上的MySQL