mysql 统计表_MySQL统计表的设计
如果应用在表中保存统计字段,则在更新统计表时可能碰到并发问题。统计表在web应用中非常常见。可以用这个表缓存一个用户的朋友书、文件下载次数等。创建一张独立的表存储统计数据是一种非常好的做法,这样可以使统计表小并且快。使用独立的表可以帮助避免查询缓存失效。如下面这个例子:
假设有一个统计表,只有一行数据,记录网站的点击次数。
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;
要获得统计结果,使用具和函数sum()进行查询:
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( day , slot )
) ENGINE=InnoDB;
在这个场景里,可以不用像前面那样,预先生成行,而是用 ON DUPLICATE KEY UPDATE代替:
INSERT INTO daily_hit_counter( day , slot , cnt )
values( CURRENT_DATE , RAND() * 100 , 1 )
ON DUPLICATE KEY UPDATE cnt = cnt + 1;
如果希望减少表的行数,以避免表变得太大,可以写一个周期执行的任务,合并所有结果到0号槽,并且删除所有其他的槽:
UPDATE daily_hit_counter as c
INNER JION(
SEKECT day , SUM( cnt ) AS cnt , MIN( slot ) AS mslot
FROM daily_hit_counter
GROUP BY day
) AS x USING( day )
SET c.cnt = IF( c.slot = x.mslot , x.cnt , 0 ),
c.slot = IF( c.slot = x.mslot , 0 , c.slot );
DELETE FROM daily_hit_counter WHERE slot <> 0 AND cnt = 0;
mysql 统计表_MySQL统计表的设计相关推荐
- Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...
- mysql status关键字 数据表设计中慎重使用
mysql status关键字 数据表设计中慎重使用 转载于:https://www.cnblogs.com/toSeeMyDream/p/5574894.html
- mysql 源码设计,java+mysql大学网络社区平台设计+源代码
摘要如今,信息管理与信息系统的网络平台上,更多的都是一些静态信息的介绍,缺乏老师与老师之间, 老师与同学之间信息的交流的功能. 因此, 需要建立一个从 Web 1.0转换到 Web 2.0 的, 能够 ...
- python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...
- 【java毕业设计】基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码)——村镇旅游网站
基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现,文章末尾 ...
- 服务端指南 数据存储篇 | MySQL(03) 如何设计索引
改善性能最好的方式,就是通过数据库中合理地使用索引,换句话说,索引是提高 MySQL 数据库查询性能的主要手段.在下面的章节中,介绍了索引类型.强制索引.全文索引. 原文地址:服务端指南 数据存储篇 ...
- java毕业设计——基于Java+Bootstrap+Mysql的电影评论网站设计与实现(毕业论文+程序源码)——电影评论网站
基于Java+Bootstrap+Mysql的电影评论网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Bootstrap+Mysql的电影评论网站设计与实现,文章末尾附有本毕 ...
- 【php毕业设计】基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码)——校园新闻网站
基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于php+mysql+apache的校园新闻网站设计与实现,文章末尾附有本毕业设计的论文和源 ...
- 基于Python+Django+MYSQL的ERP管理系统的设计与实现
基于Python+Django+MYSQL的ERP管理系统的设计与实现 源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ ERP管理系统是商业信息管 ...
最新文章
- RUP within the context of the Six Best Practices
- 反汇编的应用1-软件破解
- matlab与acess连接问题
- IOS 程序内调用本地打电话功能-make a phone call
- 进程在与Windows Process Activation Service通信时出现严重错误 w3wp.exe错误
- npm升级以及使用淘宝npm镜像
- MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁
- .net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...
- 雷林鹏分享:PHP If...Else 语句
- 阿里云资深技术专家何勉:研发效能提升的系统方法
- 树莓派百度云下载工具bypy
- cnplaza照片打印管理 【即影即有软件】
- 三十难立,四十有惑:三个代际的产品经理一起聊聊职业体验
- Linux: 软件包管理工具 yum/dnf 命令(Fedora/CentOS/RedHat)
- python之sys模块
- Android工程师的职业规划篇(周末闲扯)
- ae渲染存在偏移_以后请不要问我AE和PR有什么区别了...
- 入职字节跳动一年,谈谈我的工作收获,另附入职面经
- fifa11键盘按键_FIFA 20 Player集群
- PS学习笔记-------“反选区操作” :Ctrl + shift +i