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数据库表的设计和优化(下)
二.基于单表设计的多表设计原则:(1)表关系: 一)一对一关系: 定义: 在这种关系中,关系表的每一边都只能存在一个记录.每个数据表中的关键字在对应的关系表中只能存在一个记录或者没有对应的记录.这种关 ...
- MySQL数据库表的设计和优化(上)
一.单表设计与优化: (1)设计规范化表,消除数据冗余(以使用正确字段类型最明显):数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表 ...
- mysql 商品表的设计思路(面向对象建表:类与对象)
学习地址 http://www.jtthink.com/course/play/352 商品通用信息主表:prop_main 不仔细多说,正常业务都会涉及到并且考虑的相对周全.常用字段[商品id][商 ...
- 「mysql优化专题」优化之路高级进阶——表的设计及优化(6)
正文:表的设计及优化(真技术文) 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于2 ...
- 6.MySQL优化---高级进阶之表的设计及优化
转自互联网整理. 优化之路高级进阶——表的设计及优化 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规 ...
- mysql数据库优化之表的设计和慢查询定位
一.数据库优化包含的方面 数据库优化是一种综合性的技术.并非通过某一种方式让数据库效率提高非常多.而是通过多方面的提高.从而使得数据库性能提高. 主要包含: 1.表的设计合理化(3范式) 2.给表加入 ...
- MySQL基础/数据库和表的设计
MySQL基础 一:安装MySQL(按步骤操作,如果下载后使用不了,试着用360安全卫士卸载MySQL,清除残留的,方便在下载造成不必要的麻烦:如果这样也不行,那就需要重做系统在进行下载) 二:创建数 ...
- MySql数据表设计,索引优化,SQL优化,其他数据库
MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...
- MySQL库表设计小技巧
前言: 在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名.字段名命名混乱.字段类型设计混乱等等,此类数据库后续极难维护与拓展.我一直相信只有优秀的库表设计 ...
随机推荐
- [C++程序设计]多维数组元素的地址
设有一个二维数组a,它有3行4列.它的定义为int a[3][4]={{1,3,5,7},{9,11,13,15},{17,18,21,23}};a是一个数组名.a数组包含3行,即3个元 素:a[0] ...
- 几个makefile小例子
http://www.blogjava.net/canvas/articles/quick_makefile.html http://www.cnblogs.com/azraelly/archive/ ...
- mac Word 怎样放大缩小文档结构图文字大小
在文档结构图的侧栏里按住control+option,然后滑动鼠标滚轮/双指上下滚动触摸板.
- Linux中的ln
在安装了wdcp或在正常使用wdcp后,如有意无意用使用了yum更新系统或安装软件,有时会直接更新安装了yum源里的apache,这时问题就来了打开所有的网站或页面,都是提示Apache欢迎页面 这个 ...
- @Scheduled(cron="") spring定时任务时间设置
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天( ...
- 分析java 嵌套类与内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类 ...
- Arcgis api For silverlight 加载QQ地图
原文 http://www.cnblogs.com/thinkaspx/archive/2012/11/07/2759079.html //本篇博客仅在技术上探讨可行性 //如果要使用Q 地图,请 ...
- ubuntu下编译源码级QT
注意必须好好看官方文档: http://qt-project.org/doc/qt-5/linux.html 包括编译Qt库依赖的包等等. 编译过程中发现以下错误: All the OpenGL fu ...
- 软件架构 "4+1" 视图模型
1995年,Philippe Kruchten在<IEEE Software>上发表了题为<The 4+1 View Model of Architecture>的论文,引起了 ...
- CentOS 6.5 CodeBlocks::wxWidgets安装与配置
第一步, #yum install codeblocks codeblocks-contrib codeblocks-devel 第二步,到官方下载源码包,我下的是wxX11的3.0版的. #tar ...