【问题标题】:(My)SQL performance: updating one field vs many unneccesary fields(Mysql 性能:更新一个字段 vs 许多不必要的字段
【发布时间】:2011-09-21 06:00:36
【问题描述】:

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

【问题讨论】:

  • 我对特定性能的答案很感兴趣。但是,我认为您自己也说过 - 霰弹枪法很简单。也就是说,IMO,无论单个字段更新可能提供何种优化,是否值得跟踪的开销。性能是一种平衡。
  • MySQL 会检测一个字段是否没有改变并且不会对其做任何额外的工作,所以开销并没有你想象的那么糟糕。

标签: mysql performance field


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我会说去霰弹枪,但它真的取决于很多事情和你在 db 上的用途。

    • 一个用户还是数百万并发用户?
    • 字段是小还是有大的文本/blob 字段?
    • 申请表是在数据库附近填写还是通过网络或网络填写?

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

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

    但是,在所有情况下,您都可以实施简单的方法并测试任何性能问题以确保安全。

    【讨论】:

      【解决方案3】:

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

      您应该已经拥有原始数据的副本,因此弄清楚发生了哪些变化并不是什么大问题,更改更新语句以仅容纳已更改的字段也不是什么大问题。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            我会选择易于理解和实施的霰弹枪法广告。性能损失应该可以忽略不计。

            【讨论】:

              猜你喜欢
              • 2011-04-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多