2

我有两张表,为方便起见,请考虑以下示例。

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

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

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

对于联系人表中的所有行,我基本上在循环中都有以下 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 

看起来像加入的东西?

4

2 回答 2

0

我认为它应该更有效

UPDATE messages m  JOIN contacts n  on  m.email=n.email SET m.name=n.name
于 2013-04-25T08:57:14.457 回答
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 循环和一些更新语句时感觉它更快..

嗯嗯

- - - 更新 - - - -

好吧,我继续创建了 2 个脚本来测试这个..

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

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

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

脚本执行时间为 4.92 秒!并导致我的机器打嗝一瞬间.. 注意到我的一个核心出现了 100% 的峰值..

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

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

脚本花了 3.45 秒完成所有更新。@ 大约 50% 的单核峰值和 1.04 秒的后续查询(没有需要更新的字段)

结案...

希望这对社区有所帮助!

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

于 2013-04-25T08:58:09.857 回答