Mysql

有沒有辦法使用連接或任何其他方法來加速這個更新查詢

  • April 18, 2019

我有一個更新查詢,它從表 (HST) 中選擇數據並將其更新到另一個表 (PCLN) 中。PCLN 表包含約 17000 行,而 HST 表包含約 110 萬行。我在 HST 上有多個(複合)索引,儘管它是一個大表,但所有查詢都相當快(~2-3 秒)。但是,當我嘗試從該表中選擇行並更新 PCLN 時,需要 3-4 小時。

UPDATE PCLN 
SET `T1A` = ( SELECT MIN(HST.`Date`) 
             FROM `HST` 
             WHERE HST.`SYM`=PCLN.INS 
               AND HST.`DATE` >=  PCLN.Date 
               AND HST.`HP` >= PCLN.`T1`)    
WHERE `BS` = 'B';

我之前問過一個類似的問題,在實施給出的建議後確實看到了一些好處,但是查詢仍然非常慢,需要幾個小時才能完成。我對 MySQL 還不是很好,但覺得應該有一些方法可以提高這個更新查詢的性能。

這是顯示創建表 PCLN;

CREATE TABLE `PCLN` (
`SrNo` int(6) NOT NULL AUTO_INCREMENT,
`Date` date DEFAULT NULL,
`INS` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`T1` float(8,2) DEFAULT NULL,
`T1A` date DEFAULT NULL,
......
PRIMARY KEY (`SrNo`)
) ENGINE=InnoDB AUTO_INCREMENT=16893 DEFAULT CHARSET=latin1

並顯示創建表 HST

CREATE TABLE `HST` (
`SrNo` int(11) NOT NULL AUTO_INCREMENT,
`SYM` varchar(20) DEFAULT NULL,
`Date` date DEFAULT NULL COMMENT 'YYYY-MM-DD',
`HP` float(8,2) DEFAULT NULL,
....
PRIMARY KEY (`SrNo`),
UNIQUE KEY `HST_idx_SYM_date_OP` (`SYM`,`Date`,`OP`),
UNIQUE KEY `HST_idx_SYM_date_CP` (`SYM`,`Date`,`CP`),
UNIQUE KEY `HST_idx_SYM_date_PC` (`SYM`,`Date`,`PC`),
UNIQUE KEY `HST_idx_SYM_date_LP` (`SYM`,`Date`,`LP`),
UNIQUE KEY `HST_idx_SYM_Date` (`SYM`,`Date`) USING BTREE,
UNIQUE KEY `HST_idx_SYM_date_HP` (`SYM`,`Date`,`HP`) USING BTREE,
KEY `HST_idx_date` (`Date`)
) ENGINE=InnoDB AUTO_INCREMENT=1103583 DEFAULT CHARSET=latin1 COMMENT='HST 
Data - All'

在 EXPLAIN 中,我注意到對於索引 HST_idx_date,它顯示 1002718 Range 檢查了每條記錄(索引映射:0x80)。這意味著什麼,有沒有辦法限制行以加快查詢速度。任何加快查詢速度的建議將不勝感激。

伺服器版本:5.6.39-cll-lve - MySQL 社區伺服器 (GPL)。

尋找

UPDATE pcln, (  SELECT pcln.srno, MIN(hst.`date`) mindate
               FROM pcln, hst
               WHERE hst.sym=pcln.ins 
                 AND hst.`date` >=  pcln.`date` 
                 AND hst.hp >= pcln.t1
                 AND pcln.bs = 'B'
               GROUP BY pcln.srno  ) tmp
SET pcln.t1a = tmp.mindate
WHERE pcln.srno = tmp.srno;

優化子查詢創建索引pcln(bs,ins)。或者覆蓋子查詢的索引。

可能的小優化…

UNIQUE KEY `HST_idx_SYM_Date`    (`SYM`,`Date`)
UNIQUE KEY `HST_idx_SYM_date_HP` (`SYM`,`Date`,`HP`)

這對列的唯一性必然表明 3 列組合將是UNIQUE. 將第二個更改為INDEX會加快速度INSERTs/UPDATEs/DELETEs

那時,幾乎不需要這樣的 3-column INDEXes。因此,只保留“覆蓋”的索引,如EXPLAIN.

當一個子句中有多個“範圍”時WHERE(如在您的原始查詢中),只有一個範圍有用。也就是說,(SYM,DATE) 上的索引與 (SYM,DATE, HP) 上的索引一樣好,因為優化器不能同時使用 DATE 和 HP 上的兩個範圍。

引用自:https://dba.stackexchange.com/questions/232989