Php 什么';在MySQL中,同步两个表中的行数据的最佳方法是什么? 我有两个表,为了方便起见,把下面的例子当作一个例子。 联系人(有姓名和电子邮件) 消息(需要将带有姓名和电子邮件的消息同步到联系人表)

Php 什么';在MySQL中,同步两个表中的行数据的最佳方法是什么? 我有两个表,为了方便起见,把下面的例子当作一个例子。 联系人(有姓名和电子邮件) 消息(需要将带有姓名和电子邮件的消息同步到联系人表),php,mysql,sql-update,Php,Mysql,Sql Update,现在,对于那些渴望说“使用关系方法”或外键等的人,我知道,但这种情况是不同的。我需要有一个“副本”的名称和电子邮件的消息表本身,需要同步它不时只 根据同步要求,我需要将消息中的姓名与联系人表中的最新姓名同步 对于Contacts表中的所有行,我基本上都有以下更新SQL循环 UPDATE messages SET name=( SELECT name FROM contacts WHERE email = '$cur_email') WHERE email='$cur_email' 上面的循环通

现在,对于那些渴望说“使用关系方法”或外键等的人,我知道,但这种情况是不同的。我需要有一个“副本”的名称和电子邮件的消息表本身,需要同步它不时只

根据同步要求,我需要将消息中的姓名与联系人表中的最新姓名同步

对于Contacts表中的所有行,我基本上都有以下更新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 

看起来像连接的东西?

我认为它应该更有效

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

嗯。我现在明白了。。在更新时使用连接

比如:

这相当简单

但是。。。我不确定这是否真的是对我文章的回答,因为我的问题是在效率方面“最好的方法是什么”

在2000条记录上执行上述查询花了我的系统4秒钟的时间。。其中,执行一些select、php循环和一些update语句感觉速度更快

------更新--------

我继续写了两个脚本来测试这个

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

通过SQL连接执行单个更新查询要比执行多查询和循环方法慢得多

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

脚本执行时间为4.92秒!导致我的机器在一瞬间失灵。。注意到我的一个核心上有一个100%的尖峰

对脚本的后续调用(其中没有需要更新的字段)花费了相同的时间!荒谬的

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

拿了剧本 3.45秒完成所有更新..@约50%的单芯尖峰 和 后续查询1.04秒(无需更新的字段)

案件结案

希望这对社区有帮助

ps 这就是我在与过分热衷于“编码标准”的程序员讨论某些逻辑时的意思。。他们的论点是“在SQL方面做”,如果可以的话,因为它更快,更符合标准,而不是在循环中计算和更新的粗糙方法,他们说这是“脏”代码。。嘘

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