MySQL 使用双重内连接更新性能较差

标签 mysql performance join

我有 2 个表,一个称为 raw_data,有 150m 行,另一个称为 venue,也有大约 150m 行。我正在尝试运行以下查询,但几个小时后它似乎陷入困境。在 raw_data 中,MemberIDSiteID 有索引,在 venue 中,PersonIDSiteID 有索引,两个表的存储引擎都是 MyISAM,因为我们使用的是 %99 select 查询。

UPDATE `income` `t1` 
INNER JOIN `raw_data` `t2` 
   ON `t1`.`PersonID` = `t2`.`MemberID` AND `t1`.`SiteID` = `t2`.`SiteID` 
SET `t1`.`Age` = `t2`.`Age`, 
     `t1`.`Gender` = `t2`.`Gender`, 
     `t1`.`Sport` = `t2`.`Sport`, 
     `t1`.`PersonType` = `t2`.`PersonType`, 
     `t1`.`BookingType` = `t2`.`BookingType`, 
     `t1`.`TemplateName` = `t2`.`TemplateName`

您能帮助我提高性能并减少此查询的时间吗?

最佳答案

MyISAM 锁定表直到完成。

使用“复合”索引,查询运行速度会快得多(我不确定首选哪一个,也可以同时添加两者。):

income:    INDEX(PersonID, SiteID) -- in either order
raw_data:  INDEX(MemberID, SiteID) -- in either order

注意:两列上的单独索引(听起来像是您拥有的)不会那么好。

您还应该Switch to InnoDB 。 99% Selects 并不足以成为使用过时且即将被删除的 MyISAM 的借口。

为什么要将数据从一个表复制到另一个表?为什么不在需要时简单地JOIN这两个表呢?或者,换句话说,“冗余数据是禁忌”。

Here建议对UPDATE进行“分块”以使其更加文明。

关于MySQL 使用双重内连接更新性能较差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40679329/

相关文章:

mysql - 如何从基于其他 3 个表的表中选择数据?

php - 使用 php 将动态 LI 发送到 mySQL 表中

php - 通过与 MySQL 数据比较来填充 PHP 数组

php - 转义特殊字符

performance - 将 DBCP 替换为 Tomcat JDBC 池时增加负载并降低性能

database - 为什么我要使用聚合函数对覆盖查询进行索引扫描?

performance - 子集和的变体

c++ - 为什么在 C++ 函数 boost::algorithm::join_if 中抛出 std::bad_cast 异常?

php - sqlstate[23000] : integrity constraint violation: 1062 duplicate entry '1827' for key 'primary'

java - 合并/加入两个大文件