【问题标题】:MySQL poor update performance with double inner joinMySQL 双内连接更新性能差
【发布时间】:2016-11-18 14:19:11
【问题描述】:

我有 2 张表,其中一张名为 raw_data,有 150m 行,另一张名为 income,也有大约 150m 行。我正在尝试运行以下查询,几个小时后它似乎卡住了。在raw_dataMemberIDSiteID 有索引,在incomePersonIDSiteID 有索引,这两个表的存储引擎都是MyISAM,因为我们使用的是%99 选择查询。

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`

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

【问题讨论】:

  • 也许张贴 EXPLAIN 的输出以帮助诊断性能不佳?
  • +1 解释计划。这又是什么意思“被卡住”?查询是否完成?它会部分或全部更新您的数据吗?
  • 它根本不工作,表被锁定所以无法检查状态。几个小时后,我终止了查询。
  • 试过解释,即使我使用的是mysql 5.6,当我在查询前面添加解释时也会出现语法错误。
  • "两个表的存储引擎都是 MyISAM,因为我们使用的是 %99 选择查询" - 这不是使用 MyISAM 的论据。过去是这样,但由于 MySQL 5.3 InnoDB 的 SELECT 性能与 MyISAM 一样好或更好。

标签: mysql performance join


【解决方案1】:

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 以使其更加文明的建议。

【讨论】:

  • 谢谢,会尝试你的建议。标记为已解决。
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 2015-04-27
  • 2014-08-19
  • 2011-09-08
  • 2014-09-22
  • 2013-05-15
  • 2013-12-10
  • 2011-07-03
相关资源
最近更新 更多