简体   繁体   English

如何加快SQL查询

[英]How to speed up SQL query

I need advise if this adjustment is possible. 我需要建议是否可以进行此调整。

Table: 表:

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;

The current query : 当前查询:

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)

And my update is with temporary table: 我的更新是与临时表:

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);

This improvement accelerated query over 2milion rows by 400%. 此改进使对200万行的查询速度提高了400%。 But this improvement has the same result? 但是这种改进有相同的结果吗? Thank you for your answers. 谢谢您的回答。

First, use the 首先,使用

EXPLAIN command from mysql. 来自mysql的EXPLAIN命令。

After that, figure out if any indexes will help you (warning: do not create indexes out of control) Also, check the documentation for composite indexes on mysql 之后,找出是否有任何索引对您有帮助(警告:不要在无法控制的情况下创建索引)。此外,请查看mysql上复合索引的文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM