【问题标题】:Optimized ways to update every record in a table after running some calculations on each row优化每行计算后更新表中每条记录的方法
【发布时间】:2012-03-10 13:26:41
【问题描述】:

有一个包含数百万条记录的大表。 phpMyAdmin 报告表大小为 1.2G。

需要对每一行进行计算。计算并不简单(不能放入 set col= calc 格式),它使用存储函数来获取值,因此目前我们对每一行进行一次更新。

这非常慢,我们想要优化它。

存储函数:
https://gist.github.com/a9c2f9275644409dd19d

每行都会被这个方法调用:
https://gist.github.com/82adfd97b9e5797feea6

这是在离线服务器上执行的,通常每周更新一次。

我们在这里有什么选择。

【问题讨论】:

  • 需要更多信息才能给出任何有意义的答案。表的结构是什么?你在做什么计算,为什么?你的(未优化的)代码现在在做什么?
  • 这个函数是什么?它是否使用其他表或同一表中的其他行?
  • 如果没有关于实际表架构/存储函数/计算的任何信息,很难回答。另外,这是一次性更新还是需要经常运行的东西?
  • 发布用于更新行的代码。但请记住,更新 mysql 中的数百万条记录肯定需要一些时间,无论您使用哪种方式...
  • 已发布代码。我希望可以提出一些一般性建议,例如重新创建表或使用替换成,或从临时表中选择。

标签: php mysql sql linux


【解决方案1】:

为什么不设置一个单独的表来保存计算值以减轻当前表的负担。它可以有两列:主表中每一行的主键和计算值的列。

那么你的流程可以是:

a) 截断 computedValues 表 - 这比尝试识别新行要快

b) 计算值并插入计算值表中

c) 因此,当您需要计算值时,您可以使用快速的主键连接来连接到 computedValues 表,如果您需要更多计算,您只需添加新列。

d) 如果需要,您还可以使用计算值更新主表

【讨论】:

    【解决方案2】:

    好吧,问题似乎不在于 UPDATE 查询,因为查询本身没有执行任何计算。看起来首先执行计算,然后运行 ​​UPDATE 查询。所以 UPDATE 应该足够快。

    当您说“这非常慢”时,我假设您指的不是 UPDATE 查询,而是完整的过程。以下是一些快速的想法:

    1. 正如您所说,有数百万条记录,更新这么多条目总是很耗时。而且如果表上定义了很多列和索引,就会增加开销。

    2. 我看到函数 getNumberOfPeople() 中有很多 REPLACE INTO 查询。这些也可能是进程缓慢的一个原因。您是否检查过这些 REPLACE INTO 查询的效率如何?您能否尝试删除它们,然后查看它是否对 UPDATE 过程有任何影响。

    3. getNumberOfPeople() 中也有几个 SELECT 查询。检查它们是否会影响流程,如果是,请尝试优化它们。

    4. 在过程 updateGPCD() 中,您可以尝试将 SELECT COUNT(*) INTO _has_breakdown 替换为 SELECT COUNT(1) INTO _has_breakdown。在同一个查询中,WHERE 条件正在读取 _ACCOUNT,但是当 _ACCOUNT = 0 时这将失败,不是吗?

    在另一个建议中,如果您认为由于原因 1 是 UPDATE 很慢,则将更新列 gpcd 移到 usage_bill 之外可能是有意义的。表中唯一的其他列应该是来自 usage_bill 的唯一 ID。

    希望以上内容有意义。

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多