Mysql
有沒有辦法使用連接或任何其他方法來加速這個更新查詢
我有一個更新查詢,它從表 (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 上的兩個範圍。