mysql UPDATE 语句 - 相同值的开销?

Posted

技术标签:

【中文标题】mysql UPDATE 语句 - 相同值的开销?【英文标题】:mysql UPDATE statement - overhead for same values? 【发布时间】:2010-07-06 14:06:58 【问题描述】:

我有一个包含数十万条记录的大型 mysql 数据库。我想更新大量的字段,但我不知道该字段是否已更新。

如果我调用设置 authortype=10 并且 authortype 已经为 10 的更新语句,这是否比单独查询仅选择那些不是 authortype=10 的语句然后更新它们更快?

换句话说,如果我设置的值等于它已经存在的值,那是否比我将值更新为新值更快?再次,这是有大量的记录,我想提高效率。

提前致谢

【问题讨论】:

【参考方案1】:

不,MySQL 很聪明,不会变慢。不用费心去检查,MySQL 会帮你做的。

如果您将列设置为其当前具有的值,MySQL 会注意到这一点并且不会更新它。不执行写操作。 (Source)

但是,

MySQL 可以在要更新的列上使用 WHERE 子句来确定要使用的索引(以及要检查的行),在这种情况下,它可能会加快您的 UPDATE 操作。 如果您的列已编入索引,请务必将其包含在内

【讨论】:

@JiminyCricket - 请注意,这可能会误导您的实际问题。 单独的 查询很可能会更慢。我相信 Konerak 告诉你的是,不使用 where 子句并不慢。我不同意。 原则上,WHERE 可能更快,不是因为它会使任何写入短路,而是因为它可以使用索引来缩小首先查看的行数。实际上,像 authortype<>10 这样的不相等比较不会从索引中受益。【参考方案2】:

为什么不直接使用

UPDATE  dbo.Authors
SET     AuthorType = 10
WHERE   AuthorType <> 10

两全其美。

请注意,几十万条记录对于任何现代数据库引擎来说都不会造成问题。

小修改

【讨论】:

这比做 2 次查询要快,而且应该比更新不需要更新的记录要快。 OP 要求最有效的解决方案。他现在的印象是,不使用 where 子句是最有效的解决方案。 WHERE 子句可能 使用索引来进行更新。这总是优于空白更新。 @Lieven 哦,什么?当我认为这个答案是错误的时,我不知道我在抽什么 - 你能做一个小的编辑,以便我可以将我的反对票恢复为赞成票吗? @Lieven,谢谢。对不起,我不知道我在做什么,但他们应该在盒子上打印“不要与互联网结合”;)【参考方案3】:

如果您的表包含数十万行,则不必担心需要多长时间。做出决定所花费的时间将远远大于做决定所花费的时间。

如果你有数亿行,那可能就是另一回事了。

【讨论】:

以上是关于mysql UPDATE 语句 - 相同值的开销?的主要内容,如果未能解决你的问题,请参考以下文章

MySql 更新update表中某一个字段记录

使用 DEFAULT 值准备 MySQL INSERT/UPDATE 语句

如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL

面试官:MySQL 中 update 更新,数据与原数据相同时会执行吗?大部分人答不上来!

如何在mysql中更新具有相同值的多行[关闭]

mysql update 语句的行为会根据用户变量是不是存在而有所不同