在MySQL中的两个表中同步行数据的最佳方法是什么?

时间:2013-04-25 06:45:23

标签: php mysql sql-update

我有两张桌子,为了方便起见,请考虑以下内容作为示例。

  • 联系人(有姓名和电子邮件)
  • 消息(消息,但也有名称和电子邮件w / c需要同步到联系人表)

现在请,对于那些渴望说“使用关系法”或外键等的人我知道,但这种情况有所不同。我需要在消息表本身上对消息的名称和电子邮件进行“复制”,并且需要不时地同步它。

根据同步要求,我需要将消息上的名称与联系人表格上的最新名称同步。

我基本上在Contacts表中的所有行的循环中都有以下UPDATE SQL

UPDATE messages SET name=(
SELECT name FROM contacts WHERE email = '$cur_email')
WHERE email='$cur_email'

以上循环遍历所有联系人,并触发尽可能多的联系人。

我有几个循环的想法也可以这样做而不使用内部SELECT,但我只是认为上面会更有效(是吗?),但我想知道是否有更高效的SQL方式?像:

UPDATE messages SET name=(
SELECT name FROM contacts WHERE email = '$cur_email')
WHERE messages.email=contacts.email 

看起来像加入的东西?

2 个答案:

答案 0 :(得分:0)

我认为它应该更有效率

UPDATE messages m  JOIN contacts n  on  m.email=n.email SET m.name=n.name

答案 1 :(得分:0)

确定。我现在想出来..在更新时使用JOINS

像:

UPDATE messages JOIN contacts ON messages.email=contacts.email
SET messages.email = contacts.email
WHERE messages.email != contacts.email

这很简单!

但是......我不确定这是否真的是对我的帖子的回答,因为我的问题是效率方面的“最佳方式”......

在2000条记录上执行上面的查询使我的系统暂停了4秒......其中执行一些select,php循环,以及一些更新语句感觉它更快......

hmmmmm

------ UPDATE --------

我继续前进并创建了2个脚本来测试它..

在我的QuadCore i7 Ivybridge机器上,令人惊讶

通过SQL JOIN进行的单个更新查询比执行相当多的查询和循环方法要快得多......

一方面我在1000条记录上运行上述简单查询,其中所有记录都需要更新......

脚本执行时间是4.92秒!并导致我的机器一瞬间慌乱..注意到我的一个核心上有100%的峰值..

成功调用脚本(没有需要更新的字段)花费相同的时间!可笑..

另一方面,涉及对所有需要更新的行进行SELECT JOIN查询,以及在PHP中的foreach()函数中循环的简单UPDATE查询。

拿了剧本 3.45秒做所有更新.. @约50%单核秒杀 和 成功查询的1.04秒(没有需要更新的字段)

案件结束......

希望这有助于社区!

PS 这就是我与程序员辩论某些逻辑时的意思,他们过于注重“编码标准”......他们的论点是“在SQL端做”,如果可以,因为它更快,更多的是标准而不是粗略的方法评估和更新循环w / c他们说是“脏”代码.. sheesh。