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 语句 - 相同值的开销?的主要内容,如果未能解决你的问题,请参考以下文章
使用 DEFAULT 值准备 MySQL INSERT/UPDATE 语句
如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL