如何通过读取、递增和更新数据库中的列来有效地保持计数
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
子句中的条件都引用索引,因此查找行可能会尽可能快。
如果不费力气,我希望更新足够快。您应该对此进行测试,看看是否属实。您还可以在请求表中插入一行,并在查询该表时进行计数。 inserts
比 updates
快,因为引擎不必先找到行。
如果这不能满足性能目标,那么某种分布式机制可能会被证明是成功的。我认为使用序列对请求进行批处理并不是一个简单的解决方案。尽管队列很可能已分发,但您会遇到请求计数与实际更新不同步的问题。
【讨论】:
感谢您的回复。我更多地考虑了由所有来源更新的单个队列的行,以及从这个队列中读取的单个作业。以上是关于如何通过读取、递增和更新数据库中的列来有效地保持计数的主要内容,如果未能解决你的问题,请参考以下文章