2016-11-18 42 views
-1

我有两个表格,一个名为raw_data,它有150米行,另一个称为income,它也有大约150米行。我正在尝试运行以下查询,并在几个小时后似乎卡住了。在raw_data,MemberIDSiteID有索引,在income,PersonIDSiteID有索引,这两个表的存储引擎都是MyISAM,因为我们使用了%99选择查询。MySQL双重内部连接更新性能差

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` 

请您帮我改进性能并减少此查询的时间?

+3

也许发布EXPLAIN的输出以帮助诊断性能差的问题? –

+0

+1解释计划。此外,这是什么意思“被卡住”?查询完成了吗?它是否部分或完全更新您的数据? –

+0

它根本不工作,表被锁定,所以无法检查状态。几个小时后,我正在查询。 –

回答

0

MyISAM锁表直到完成。在独立指标:

查询会跑了很多与“复合”索引更快(我不知道哪一个是首选,不妨增加两者。):

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

注两列(这听起来像你有)将不是是一样好。

你也应该Switch to InnoDB。 99%选择不是使用过时的,即将被删除的MyISAM的充分借口。

为什么要将数据从一个表复制到另一个表?为什么不简单地JOIN两个表,只要你需要它。或者换句话说,“冗余数据是不可能的”。

Here是'块'UPDATE的建议,使其更文明。

+0

谢谢,会尝试你的建议。标记为已解决。 –