2012-03-10 43 views
1

有一个可容纳数百万条记录的大表。 phpMyAdmin为表格报告1.2G大小。在每行上执行一些计算后更新表中每条记录的优化方法

需要对每一行进行计算。这个计算并不简单(不能用set col = calc格式),它使用一个存储函数来获取值,所以目前我们每行都有一个更新。

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

存储功能:
https://gist.github.com/a9c2f9275644409dd19d

,这是由该方法的每一行称为:
https://gist.github.com/82adfd97b9e5797feea6

这是一个离现场服务器上执行,通常是每周更新一次。

我们在这里有什么选择。

+0

需要更多的信息才能给出任何有意义的答案。桌子的结构是什么?你在做什么计算,为什么?你的(未被优化的)代码现在在做什么? – GordonM 2012-03-10 13:34:43

+0

这个功能是什么?它是否使用其他表或同一表中的其他行? – wildplasser 2012-03-10 13:35:05

+0

如果没有关于实际表格模式/存储函数/计算的任何信息,很难回答。此外,这是一次性更新还是需要经常运行的东西? – 2012-03-10 13:36:02

回答

4

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

然后你的过程可能是:

一)截断computedValues表 - 这是不是试图找出新行

b)计算的值,并将其插入计算值表

Ç快)所以,当你需要计算值时,你可以使用快速的主键连接加入到computedValues表中,如果你需要更多的计算,那么你只需添加新的列。

d)您也可以使用计算值更新主表,如果你有

0

好了,问题似乎并没有因为没有计算在查询本身执行的是更新查询。因为它似乎首先执行计算,然后运行UPDATE查询。所以UPDATE应该足够快。

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

  1. 正如你所说的有几百万的记录,更新这些许多条目总是费时。如果在表上定义了许多列和索引,则会增加开销。

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

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

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

在另一项建议,如果你认为是因为理由1速度慢的更新时,它可能是有意义的外usage_bill移动更新列gpcd到另一个表。表中唯一的其他列应该是来自usage_bill的唯一ID。

希望以上内容有意义。

相关问题