如何通过读取、递增和更新数据库中的列来有效地保持计数

Posted

技术标签:

【中文标题】如何通过读取、递增和更新数据库中的列来有效地保持计数【英文标题】:How to efficiently keep count by reading, incrementing it & updating a column in the database 【发布时间】:2014-06-25 12:13:08 【问题描述】:

我在数据库中有一个列,用于记录传入请求的数量,但从不同的来源和系统进行更新。 传入的请求以每分钟数千为单位。 使用新请求计数更新此列的最佳方法是什么? 我头顶的两种方法是-

    从列中读取当前值,将其加一,然后将其更新回来(存储过程的所有部分)。 我看到的问题是每个更新的源/系统都需要锁定此列,这可能会增加读取和更新列的等待时间。并且会减慢 DB。

    将请求放入队列,作业读取队列并更新列,一次一个。至少在我看来,这种方法看起来更安全,但是要计算传入的请求数量是否需要太多工作?

在大量情况下,您通常会采用什么方法在列中读取和更新?

谢谢

【问题讨论】:

【参考方案1】:

每分钟 1000 秒并不是“巨大的”。假设它每分钟10k。每次更新只剩下 6 毫秒的时间。对于具有简单整数增量且索引不多的内存行,每次更新预计

所以就用

UPDATE T SET Count = Count + 1 WHERE ID = 1234

【讨论】:

【参考方案2】:

在数据库上放一个索引,然后做:

update table t
    set request_count = requestcount + 1
    where <whatever conditions are appropriate>;

请确保where 子句中的条件都引用索引,因此查找行可能会尽可能快。

如果不费力气,我希望更新足够快。您应该对此进行测试,看看是否属实。您还可以在请求表中插入一行,并在查询该表时进行计数。 insertsupdates 快​​,因为引擎不必先找到行。

如果这不能满足性能目标,那么某种分布式机制可能会被证明是成功的。我认为使用序列对请求进行批处理并不是一个简单的解决方案。尽管队列很可能已分发,但您会遇到请求计数与实际更新不同步的问题。

【讨论】:

感谢您的回复。我更多地考虑了由所有来源更新的单个队列的行,以及从这个队列中读取的单个作业。

以上是关于如何通过读取、递增和更新数据库中的列来有效地保持计数的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用数据框中的其他列来聚合熊猫数据框中的列

如何在大数据帧的每组中有效地随机标记行?

如何通过给定Linux中另一个文件中的列来从文件中删除列?

通过选择 Pandas 中的其他列来更新条件列值

如何通过在 MATLAB 中模板化 2D 数组的列来创建 3D 数组?

在对另一个表进行更新后,如何更新表中的列?