mysql中列值的增量更新。并发问题?

mysql中列值的增量更新。并发问题?,mysql,rabbitmq,innodb,scalability,Mysql,Rabbitmq,Innodb,Scalability,我有一个类似的问题 update pageviews set count = count + 1 where pageid = $pageid 此语句在每次查看网页时执行。因此,每次查看页面时,列计数都会增加 我的桌子是InnoDB类型的 假设每秒可以发生数千次页面浏览,这是不可伸缩的吗?我会遇到并发问题吗?比如查询锁定等等 有人告诉我,我应该使用队列来达到这样的目的。为什么我需要使用队列?在什么样的情况下,我的数据会被破坏,或者可伸缩性会成为一个问题?在商品硬件上,InnoDB每秒处理大约1

我有一个类似的问题

update pageviews set count = count + 1 where pageid = $pageid
此语句在每次查看网页时执行。因此,每次查看页面时,列计数都会增加

我的桌子是InnoDB类型的

假设每秒可以发生数千次页面浏览,这是不可伸缩的吗?我会遇到并发问题吗?比如查询锁定等等


有人告诉我,我应该使用队列来达到这样的目的。为什么我需要使用队列?在什么样的情况下,我的数据会被破坏,或者可伸缩性会成为一个问题?

在商品硬件上,InnoDB每秒处理大约100条这样的语句。没有并发或锁定问题,只有性能问题

  • innodb\u flush\u log\u at\u trx\u commit
    为安全起见,默认值为1。但这需要对每个事务进行磁盘I/O记录。2更快,是一个合理的折衷方案。(崩溃可能会损失1秒的交易量。)

  • 您的
    更新
    可能是
    自动提交的
    ?还是在一项交易中?它能以任何方式分批处理吗?如果是这样,那将减少开销

  • 页面视图由web服务器处理,对吗?它能在实际写入表之前收集一些pageid吗?即使它收集了一秒钟,这可能是一个显着的加速。如果执行此操作,请确保对
    update pageviews set count=count+1其中pageid IN(…)
    中的
    列表进行排序。这将减少出现僵局的可能性

  • 处理
    更新中的错误。(否则,您的数据将“错误”或“损坏”。)


除了@Rick的回答:我不知道队列如何帮助您,我唯一的想法是将所有页面事件发送到队列中,在队列中您有多个消费者,每个消费者都更新自己的数据库,然后聚合结果。此外,队列还允许您在短时间内有大量负载时处理一些峰值负载—在这种情况下,您将把事件放入内存中,稍后再处理它们,而不是阻止数据库更新,但如果您不能在常规负载下处理事件流,则不会有任何帮助

还有一个建议——如果你每秒有数千次页面浏览,你可能不需要精确地跟踪它们(如果不是账单),因此如果你有一个有状态的服务器,你可以有这样的代码:

onPageView() {
    cnt += 1
    if (cnt == 1000) {update table set views = views + 1000; counter = 0;}
}
(不要忘记螺纹安全)

甚至

onPageView() {
   value = random(0, 1000);
   if (value == 0) {
       update table set views = views + 1000
   }    
}
而且,您不需要关心状态,您可以将写入数减少1000倍