(Mysql性能:更新一个字段vs许多不必要的字段

时间:2011-06-23 13:40:30

标签: mysql performance field

我正在为正在编辑现有记录的用户处理包含大量字段的表单。用户可能只更改了一个字段,我通常会执行更新查询来设置所有字段的值,即使它们中的大多数都没有更改。我可以进行某种跟踪,看看哪些字段实际发生了变化,只更新了少数字段。更新记录中的所有字段与仅更改的字段之间是否存在性能差异?还有其他理由可以采用这两种方法吗?霰弹枪方法非常简单......

6 个答案:

答案 0 :(得分:7)

我想说这取决于以下几点:

  • 正在进行的数据大小 加工
  • 数据库服务器的位置 相对于应用程序
  • 完成任何检查所需的时间 用于数据更改

如果要传输大量数据和/或连接是远程的,那么您应该进行一些测试,看看是否可以通过跟踪更改来提高性能。否则,您可能会发现假设正在操作一条记录,它可以忽略不计。

答案 1 :(得分:3)

我会说霰弹枪,但它真的取决于很多东西以及你对数据库的使用。

  • 一个用户或数百万并发用户?
  • 字段是小还是有大文本/ blob字段?
  • 表单是在db附近还是通过网络或Web填充的应用程序?

您必须考虑到UPDATE不仅要将新的(甚至是未更改的)字段存储到表中,还要考虑:

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

但是,在所有情况下,您都可以轻松实施并测试任何性能问题是否安全。

答案 2 :(得分:2)

如果您正在谈论合理数量的数据(例如1kb +),那么优化可能是值得的。如果这个语句/表经常运行/更新(每秒几次?),多个用户等,可能值得优化。

您应该已经拥有原始数据的副本,因此找出已更改的内容不是一个大问题,也不会更改update语句以仅适应更改的字段。

所以这可能不是一个坏主意,但除非你想节省带宽,或者觉得你需要提高性能,否则可能没有必要。

答案 3 :(得分:1)

当然,在更新多个字段时会有一些开销,但与维护关于哪些字段更改的状态的成本相比,开销会很小。如果这是一个表,我不会担心根据表单的状态有选择地更新列。

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

答案 4 :(得分:1)

通过仅更新单个字段,您实际上可能会失去性能。如果您正在使用预准备语句,那么数据库已经编译了用于更新所有字段的查询计划。如果您开始更新随机字段,那么每次更新时都必须解析查询,从而失去预准备语句的好处。我不确定这对MySQL有多大影响,但我知道它对SQL Server和Oracle来说可能很重要。

答案 5 :(得分:0)

我会选择霰弹枪方法广告,这很容易理解和实施。性能打击应该是可以忽略的。

相关问题