为什么更新mysql查询运行速度慢

时间:2015-05-26 06:32:09

标签: mysql sql

我有一个SQL Tabe“STG_S_CUST”,它包含很多行(最多150万)和另一个包含很多行的表“S_CUST”。 当我执行以下更新查询时,它非常慢,需要花费太多时间。

UPDATE STG_S_CUST AS STG
INNER JOIN S_CUST AS ST ON STG.SRC_NM=ST.SRC_NM
AND STG.SRC_KEY = ST.SRC_KEY
SET UPDATE_IND = 1,
STG.S_ID = ST.S_ID,
STG.M_ID = ST.M_ID
WHERE STG.PROCESSED_IND = 0

问题是,我得到一个Timeout-Exception无法执行SQL。

EXPLAIN UPDATE STG_S_CUST AS STG
INNER JOIN S_CUST AS ST ON STG.SRC_NM=ST.SRC_NM
AND STG.SRC_KEY = ST.SRC_KEY
SET UPDATE_IND = 1,
STG.S_ID = ST.S_ID,
STG.M_ID = ST.M_ID
WHERE STG.PROCESSED_IND = 0

Result:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE          ST      ALL     NULL             NULL    NULL       NULL    10479   NULL
1   SIMPLE          STG     ALL     NULL             NULL    NULL       NULL    159334  Using where; Using join buffer (Block Nested Loop)

这是创建表的缩写版本

STG_S_CUST:

  CREATE TABLE `STG_S_CUST` (
 `STG_ID` int(14) NOT NULL AUTO_INCREMENT,
 `STG_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON  UPDATE CURRENT_TIMESTAMP,
 `SRC_KEY` varchar(100) DEFAULT NULL,
 `SRC_NM` varchar(20) DEFAULT NULL,
 `M_ID` int(14) DEFAULT NULL,
 `S_ID` int(14) DEFAULT NULL,
 `PROCESSED_IND` int(1) NOT NULL DEFAULT '0',
 `THREAD_ID` int(3) DEFAULT NULL,
 `UPDATE_IND` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`STG_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=171998 DEFAULT CHARSET=latin1

S_CUST:

 CREATE TABLE `S_CUST` (
 `S_ID` int(14) NOT NULL AUTO_INCREMENT,
 `SRC_KEY` varchar(100) DEFAULT NULL,
 `SRC_NM` varchar(20) DEFAULT NULL,
 `M_ID` int(14) DEFAULT NULL,
 PRIMARY KEY (`S_ID`)
 ) ENGINE=InnoDB AUTO_INCREMENT=10803 DEFAULT CHARSET=latin1

有没有人有任何想法为什么这会如此缓慢以及如何加快速度? 有人可以帮我在这里进行优化吗?

1 个答案:

答案 0 :(得分:1)

在进行连接更新时,需要一些索引来使选择部分更快,首先添加以下索引

alter table STG_S_CUST add index PROCESSED_IND_idx(PROCESSED_IND); 
alter table STG_S_CUST add index SRC_idx(SRC_NM,SRC_KEY); 
alter table S_CUST add index SRC_NM_idx(SRC_NM) 

在应用索引

之前先备份表格