ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
如果应用在表中保存计数器,则在更新计数器时可能碰到并发问题,计数器表应在web应用中很常见 可以用这种表缓存一个用户的朋友数,文件下载次数等.创建一张独立的表存储计数器通常是个好主意,这样可使计数器表小而快.使用独立的表可以帮助避免查询缓存失效 应该让事情变得尽可能简单,假设有一个计数器表,只有一行数据,记录网站的点击次数 ~~~ create table hit_counter( cnt int unsigned not null ) engine=Innodb ~~~ 网站的每次点击都会导致对计数器进行更新 ~~~ update hit_counter set cnt = cnt +1; ~~~ 问题在于,对于任何想要更新这一行的事务来说,这条记录上都有一个全局的互斥锁(mutex)这会使得这些事务只能执行串行执行.要获得更高的并发更新性能,也可以将计数器保存在多行中,每次随机选择一行进行更新.这样做需要对计数器表进行如下修改 ~~~ create table hit_counter( slot tinyint unsigned not null primary key, cnt int unsigned not null )engine=Innodb; ~~~ 然后预先在这张表增加100行数据.现在选择一个随机的槽(slot)进行更新 ~~~ update hit_counter set cnt = cnt+1 where slot = rand()*100; ~~~ 要获得统计结果,需要使用下面这样的聚合查询 ~~~ select sum(cnt) from hit_counter; ~~~ 一个常见的需求是每隔一段时间开始一个新的计数器(例如,每天一个).如果需要这么做,则可以再简单的修改下表的设计 ~~~ create table daily_hit_counter ( day date not null, slot tinyint unsigned not null, cnt int unsigned not null, primary key(day,slot) )engine=Innodb; ~~~ 在这个场景中,可以不用像前面的例子那样预先生成行,而用`on duplicate key update` 代替