MySQL计数器表

本文探讨了在Web开发中如何处理计数器表的并发问题,提出了使用事务和独立计数器表的方法。为提高并发更新性能,引入slot池设计,使多个事务能并行更新不同行,从而降低锁竞争。在查询时,通过特定语句汇总slot数据。然而,优化读取速度可能牺牲写入性能和增加开发维护成本,需要找到性能与复杂度的平衡。
摘要由CSDN通过智能技术生成

在Web开发中经常会遇到需要计数器表的场景,如果将计数器保存在表中,在操作表时可能会遇到并发问题。因此,通常的做法是为计数器单独建立一个表,在写入操作时通过事务在处理业务表的同时处理计数器。

        比如一个典型的场景:记录新闻的浏览量。这个场景的表结构可能如下所示:

create table article(
	article_id int unsigned auto_increment primary key,
	article_author varchar(20) not null,
	article_title  varchar(50) not null,
	article_content text not null
);
create table article_counter(
	article_id int unsigned primary key,
	cnt int unsigned not null
);


在添加或者删除新闻纪录时,需要在事务中操作计数器表。此时有一个问题,当大量的事务访问同一个新闻的计数器时,只能串行执行。

为了更高的并发更新性能,我们为计数器表增加一个池子slot,此时计数器表的结构如下:

create table article_counter(
	article_id int unsigned,
        slot tinyint unsigned,
	cnt int unsigned not null,
    <span style="white-space:pre">	</span>primary key(article_id,slot)
);

池子slot的存在使得每条新闻不再只有一个计数器,而是多个计数器。比如可以设置slot的大小是10。这样不同的事务在访问的时候,随机生成一个数字(1-10)作为slot,如何该slot存在则更
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值