【问题标题】:Optimize sql query update in MySQL 5.5.62 versionMySQL 5.5.62版本优化sql查询更新
【发布时间】:2020-07-29 09:02:48
【问题描述】:

我使用 MySql RDBMS

mysql> SELECT VERSION();
+------------------+
| VERSION()        |
+------------------+
| 5.5.62           |
+------------------+
1 row in set

在我的 MySql RDBMS 上,我有两个表

  1. tbl_old,行数745.088
  2. tbl_new,行数115.127

我需要在 tbl_newcod_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


【解决方案1】:

这就是我的想法:

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 NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`sID`),
  KEY (cod_org_new,element_new,type2) 
) ENGINE=InnoDB;



CREATE TABLE `tbl_old` (
  `COD_ORG_Old` char(4) DEFAULT NULL,
  `cod_Old` char(6) DEFAULT NULL,
  `cod_series` int  DEFAULT NULL,
  `element_Old` char(6) DEFAULT NULL,
  `sID` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`sID`),
  KEY (cod_org_old,element_old,cod_series)
) ENGINE=InnoDB;

或者这些索引的一些变体。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多