如果应用在表中保存统计字段,则在更新统计表时可能碰到并发问题。统计表在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统计表的设计相关推荐

  1. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  2. mysql status关键字 数据表设计中慎重使用

    mysql status关键字  数据表设计中慎重使用 转载于:https://www.cnblogs.com/toSeeMyDream/p/5574894.html

  3. mysql 源码设计,java+mysql大学网络社区平台设计+源代码

    摘要如今,信息管理与信息系统的网络平台上,更多的都是一些静态信息的介绍,缺乏老师与老师之间, 老师与同学之间信息的交流的功能. 因此, 需要建立一个从 Web 1.0转换到 Web 2.0 的, 能够 ...

  4. python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...

  5. 【java毕业设计】基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码)——村镇旅游网站

    基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现,文章末尾 ...

  6. 服务端指南 数据存储篇 | MySQL(03) 如何设计索引

    改善性能最好的方式,就是通过数据库中合理地使用索引,换句话说,索引是提高 MySQL 数据库查询性能的主要手段.在下面的章节中,介绍了索引类型.强制索引.全文索引. 原文地址:服务端指南 数据存储篇 ...

  7. java毕业设计——基于Java+Bootstrap+Mysql的电影评论网站设计与实现(毕业论文+程序源码)——电影评论网站

    基于Java+Bootstrap+Mysql的电影评论网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Bootstrap+Mysql的电影评论网站设计与实现,文章末尾附有本毕 ...

  8. 【php毕业设计】基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码)——校园新闻网站

    基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于php+mysql+apache的校园新闻网站设计与实现,文章末尾附有本毕业设计的论文和源 ...

  9. 基于Python+Django+MYSQL的ERP管理系统的设计与实现

    基于Python+Django+MYSQL的ERP管理系统的设计与实现  源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ ERP管理系统是商业信息管 ...

最新文章

  1. RUP within the context of the Six Best Practices
  2. 反汇编的应用1-软件破解
  3. matlab与acess连接问题
  4. IOS 程序内调用本地打电话功能-make a phone call
  5. 进程在与Windows Process Activation Service通信时出现严重错误 w3wp.exe错误
  6. npm升级以及使用淘宝npm镜像
  7. MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁
  8. .net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...
  9. 雷林鹏分享:PHP If...Else 语句
  10. 阿里云资深技术专家何勉:研发效能提升的系统方法
  11. 树莓派百度云下载工具bypy
  12. cnplaza照片打印管理 【即影即有软件】
  13. 三十难立,四十有惑:三个代际的产品经理一起聊聊职业体验
  14. Linux: 软件包管理工具 yum/dnf 命令(Fedora/CentOS/RedHat)
  15. python之sys模块
  16. Android工程师的职业规划篇(周末闲扯)
  17. ae渲染存在偏移_以后请不要问我AE和PR有什么区别了...
  18. 入职字节跳动一年,谈谈我的工作收获,另附入职面经
  19. fifa11键盘按键_FIFA 20 Player集群
  20. PS学习笔记-------“反选区操作” :Ctrl + shift +i

热门文章

  1. 在ppt Excel world中 批量删除超链接
  2. linux终端能显示中文,但是不能输入中文的解决方法
  3. 假如生活欺骗了你 (普希金诗歌)_ywyuan_新浪博客
  4. Android调用微信扫一扫和支付宝扫一扫
  5. 物联网发展现状与典型应用
  6. 中国蚁剑AntSword反制 RCE漏洞复现 windows环境上反弹shell 吊打攻击你的黑客
  7. CSUST 2007-我爱吃烧烤(状压DP)
  8. 全球IP地址短缺的危机 思科可同时支持IPv4和IPv6
  9. 【历史上的今天】8 月 30 日:首台通用电子计算机的发明者诞生;谷歌推出第一个涂鸦
  10. Kahan求和公式原理