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条这样的语句。没有并发或锁定问题,只有性能问题
为安全起见,默认值为1。但这需要对每个事务进行磁盘I/O记录。2更快,是一个合理的折衷方案。(崩溃可能会损失1秒的交易量。)innodb\u flush\u log\u at\u trx\u commit
- 您的
可能是更新
?还是在一项交易中?它能以任何方式分批处理吗?如果是这样,那将减少开销自动提交的
- 页面视图由web服务器处理,对吗?它能在实际写入表之前收集一些pageid吗?即使它收集了一秒钟,这可能是一个显着的加速。如果执行此操作,请确保对
中的update pageviews set count=count+1其中pageid IN(…)
列表进行排序。这将减少出现僵局的可能性
- 处理
更新中的错误。(否则,您的数据将“错误”或“损坏”。)
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倍