我有两个表,为了方便起见,考虑以下示例:
- 联系人(有姓名和电子邮件)
- 消息(消息也有名字和电子邮件w/c需要同步到联系人表)
现在请,对于那些想说"使用关系方法"或外键等的人。我知道,但这次情况不同。我需要在消息表本身的消息的名称和电子邮件的"副本",需要同步它从时间到时间。
根据同步要求,我需要将消息中的姓名与联系人表中的最新姓名同步。
对于Contacts表
中的所有行,我基本上在循环中使用以下UPDATE SQLUPDATE 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
好的。我现在明白了…在更新
时使用join:
UPDATE messages JOIN contacts ON messages.email=contacts.email
SET messages.email = contacts.email
WHERE messages.email != contacts.email
相当简单!
但是…我不确定这是否真的是我帖子的答案,因为我的问题是就效率而言,"最佳方法"是什么。
对2000条记录执行上面的查询需要系统暂停4秒。而执行一些select、PHP循环和一些update语句感觉要快得多。
hmmmmm
------ UPDATE --------
好吧,我继续并创建了2个脚本来测试这个…
在我的四核i7 Ivybridge机器上,令人惊讶的是
通过SQL JOIN执行单个Update查询要比执行多个查询和循环方法慢得多。
一方面,我在1000条记录上运行上述简单查询,其中所有记录都需要更新…
脚本执行时间为4.92秒!导致我的机器出现了瞬间的故障…注意到我的一个核心有100%的峰值。
后续对脚本的调用(其中没有需要更新的字段)花费了相同的时间!可笑. .
另一方面,涉及到对所有需要更新的行进行SELECT JOIN查询,以及在PHP中的foreach()函数中循环的简单update查询。
接受了脚本3.45秒完成所有更新…@大约50%的单核峰值和后续查询1.04秒(没有需要更新的字段)
案例关闭……
希望这对社区有帮助!
ps这就是我在与那些过于沉迷于"编码标准"的程序员争论一些逻辑时的意思。他们的论点是"在SQL方面做",如果你可以的话,因为它更快,更标准,而不是在循环中计算和更新的粗糙方法,他们说w/c是"脏"代码。天哪。