MySQL性能:更新一个字段与更新许多不必要的字段相比如何?

11

我正在处理一个表单,其中有很多字段供正在编辑现有记录的用户填写。用户可能只更改了一个字段,我通常会执行更新查询,设置所有字段的值,即使大多数字段没有更改。我可以进行某种跟踪以查看哪些字段实际上已更改,并仅更新少数更改的字段。更新整个记录中的所有字段与仅更新更改的字段之间是否存在性能差异?是否存在其他选择方法的原因?“霰弹枪”方法非常容易...


我对特定性能的答案很感兴趣。然而,我认为你自己已经说过了 - 散弹式方法非常容易。也就是说,在我看来,单个字段更新可能提供的任何优化是否值得跟踪的开销。性能是一种平衡。 - Jason McCreary
5
MySQL会检测到字段是否发生变化,如果没有变化,就不会对其进行任何额外的操作,因此开销并不像你想象的那么严重。 - Johan
6个回答

8
我认为这取决于以下几点:
  • 正在处理的数据大小
  • 数据库服务器相对于应用程序的位置
  • 完成任何数据更改检查所需的时间
如果您正在传输大量数据和/或连接是远程的,则应进行一些测试,以查看是否可以通过跟踪更改来提高性能。否则,假设只操作一个记录,则可能会发现性能可以忽略不计。

5

我会建议使用“霰弹枪”方法,但实际上这取决于很多因素,包括你对数据库的使用情况。

  • 是单个用户还是数百万并发用户?
  • 字段是否小型或者包含大型文本/二进制大对象字段?
  • 填写表单的应用程序是否靠近数据库或通过网络或Web进行访问?

你必须考虑到UPDATE语句不仅需要将新字段(即使未更改的字段)存储到表中,还需要:

  • 检查外键约束
  • 更新所有已更新字段所在的索引

无论如何,你都可以采用简单的方式,并测试任何性能问题以确保安全。


2
如果你提到的数据量是合理的(例如1kb +),那么优化可能是值得的。如果该语句/表格经常运行/更新(几秒钟内多次?),由多个用户使用等,那么进行优化可能会很有价值。
你应该已经拥有原始数据的副本,因此找出发生了什么变化并不是一个大问题,更改更新语句以适应仅更改的字段也不是一个大问题。
因此,这可能不是一个坏主意,但除非你想节省带宽或感觉需要改善性能,否则可能并不必要。

2

仅更新单个字段可能会导致性能下降。如果您正在使用预编译语句,则数据库已经编译了更新所有字段的查询计划。如果您开始更新随机字段,则每次更新时都必须解析查询,从而失去了预编译语句的好处。我不确定这在MySQL中会产生多少影响,但我知道在SQL Server和Oracle中可能会有很大影响。


1

当然,更新多个字段会有一些开销,但与维护关于哪些字段更改的状态的成本相比,这种开销是微不足道的。如果只有一个表格,我不必担心根据表单状态选择性地更新列。

此外,查看像Hibernate这样的数据库框架可能很有用,以抽象出其中的一些细节。


0

我会选择散弹枪方法,因为它易于理解和实现。性能损失应该可以忽略不计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接