mysql计数器表的设计
mysql 设计 计数器
2023-09-11 14:17:18 时间
问题:如果使用数据库表保存计数器,则在更新计数器时可能会碰到并发问题。
- 假设拥有一个计数器表,只有一行数据来记录网站的点击次数:
create table hit_counter ( cnt int unsigned not null ) engine = InnoDB;
- 每当需要增加次数时都需要进行更新:
update hit_counter set cnt = cnt + 1;
- 问题在于,每当增加一个计数,那么这条记录都会有一个全局互斥锁,所有需要修改次数的事务只能串行执行,非常影响效率。想要获得更高的并发更新性能,可以计数器保存多行,每次随机选择一行进行更新,需要对表进行如下修改:
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, solt tinyint unsigned not null, cnt int unsigned not null, primary key(day, slot) ) engine = InnoDB;
- 该需求,就不用提前预生成100行记录,而是使用
on duplicate key update
来代替:insert into daily_hit_counter values (current_date, rand() * 100, 1) on duplicate key update cnt = cnt + 1;
- 避免表变得太大,可以写一个周期性任务,合并每天所有的表都0号slot,并删除其他slot的行。
相关文章
- mysql中,root用户密码被遗忘,该如何进行重置?
- Laravel 快速填充 MySQL 千万条数据
- Mysql外键约束
- 基于Java+MySQL实现的(Web)学生成绩管理系统【100010564】
- mysql 同步机制概念
- ubuntu16.04系统彻底卸载mysql,并源码免编译重装MySQL的步骤
- Mysql 5.7源码编译启动 报error问题:The server quit without updating PID file (/data/data_mysql/mysql.pid).
- mysql的引擎选择
- MySQL主从复制状态及数据一致性监测工具
- liunux mysql MySQL表名不区分大小写的设置方法
- 2023年mysql常见面试题,mysql知识点详解
- MySQL 跨服务器查询数据
- 【转】MySQL查询缓存详解
- mysql数据库备份恢复教程
- power designer 连接mysql提示“connection test failed”
- springboot配置druid多数据源(mysql、postgresql、oracle)