我有两个表,一个称为raw_data
,其行为150米,另一个称为income
,其行也约为150米。我试图运行以下查询,它似乎在几个小时后卡住了。在raw_data
中,MemberID
和SiteID
有索引,income
,PersonID
和SiteID
都有索引,这两个表的存储引擎因为我们正在使用%99选择查询,所以是MyISAM。
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`
请您帮我改进性能并缩短查询时间吗?
答案 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是关于'chunking'UPDATE
以使其更加文明的建议。