【发布时间】:2020-07-29 09:02:48
【问题描述】:
我使用 MySql RDBMS
mysql> SELECT VERSION();
+------------------+
| VERSION() |
+------------------+
| 5.5.62 |
+------------------+
1 row in set
在我的 MySql RDBMS 上,我有两个表
-
tbl_old,行数745.088 -
tbl_new,行数115.127
我需要在 tbl_new 列 cod_New 上更新 tbl_old 上来自 cod_Old 列的值
我已经尝试过这个 SQL 查询,但执行时间很长
UPDATE `tbl_new` jjj,
`tbl_old` kkk
SET jjj.`cod_New` = kkk.`cod_Old`
WHERE
jjj.`COD_ORG_NEW` = kkk.`COD_ORG_OLD`
AND CASE
WHEN jjj.`TYPE_2` = 'SC' THEN
cod_series = 2
WHEN jjj.`TYPE_2` = 'SP' THEN
cod_series = 3
ELSE
cod_series = 4
END
AND jjj.`element_New` = kkk.`element_Old`;
插入两个表所涉及的列的索引不会改变这种情况
如何优化这个查询执行?
提前感谢您的帮助
更新
CREATE TABLE `tbl_new` (
`COD_ORG_NEW` char(4) DEFAULT NULL,
`element_New` char(6) DEFAULT NULL,
`cod_New` char(6) DEFAULT NULL,
`TYPE_2` char(2) DEFAULT NULL,
`sID` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sID`),
KEY `COD_ORG_NEW` (`COD_ORG_NEW`),
KEY `element_New` (`element_New`),
KEY `cod_New` (`cod_New`),
KEY `TYPE_2` (`TYPE_2`)
) ENGINE=MyISAM AUTO_INCREMENT=115128 DEFAULT CHARSET=latin1;
CREATE TABLE `tbl_old` (
`COD_ORG_Old` char(4) DEFAULT NULL,
`cod_Old` char(6) DEFAULT NULL,
`cod_series` int(11) DEFAULT NULL,
`element_Old` char(6) DEFAULT NULL,
`sID` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sID`),
KEY `COD_ORG_Old` (`COD_ORG_Old`),
KEY `cod_Old` (`cod_Old`),
KEY `cod_series` (`cod_series`),
KEY `element_Old` (`element_Old`)
) ENGINE=MyISAM AUTO_INCREMENT=745089 DEFAULT CHARSET=latin1;
【问题讨论】:
-
我会规范化架构。在规范化的环境中,不需要这种特殊的 case 语句。也就是说,我怀疑它对性能有多大影响。
-
@Strawberry 谢谢,但架构已标准化
-
显然,这不是真的。无论如何,大概你在
tbl_new (cod_org_new,element_new,type2,cod_series)和tbl_old (cod_org_old,element_old)上有复合索引 -
@Strawberry 是的,我有这些索引,但你是什么意思?综合指数?我试过在 WHERE 子句中不使用 case 语句,情况没有改变,查询的执行时间很长,我不得不停止查询,问题出在别处
-
删除除主键之外的所有索引,而是在 (cod_org_new,element_new,type2,cod_series) 和 (cod_org_old,element_old) 上创建索引
标签: mysql