高性能MySql进化论(四):Summary,Cache,Counter表的使用

标签: 性能 mysql 进化论 | 发表时间:2013-09-11 06:08 | 作者:sun7545526
出处:http://blog.csdn.net

在实际的应用中,往往会定期的对一个周期内的系统数据进行统计分析。例如某购物网站定期的统计商品在一个月/年期内的销售情况,如果采用扫描所有相关表的方式在某个时间点进行统计分析, 由于数据量很大,以及表结构的复杂,性能可能会是很大的问题。针对这种情况可以通过使用Summary,Cache,Counter 数据表的方式来提高分析的效率。

 

Summary

可以理解为通过定期执行Group By 语句得到的表。例如系统要求月底的时候需要统计出每个商品的销售情况(销售数量,购买次数,总金额 …),为了达到这个目的可以创建一个以天为时间单位的Summary表,在每天结束的时候对每种商品进行统计分析,将分析的结果保存到Summary表中(每条记录表示每种商品在当天的销售情况),在月底需要查询某个商品在这个月的销售情况时,只需要查询Summary表中相关商品的30条记录即可。

 

Cache

可以理解为从主表中抽取一些比较常用的字段组成的一张表,这张表里的内容时间性比较强,可以定期的被清理。例如在银行系统中一般都会有一套复杂的表结构来存储用户的交易流水,这种流水表的字段比较多,数量也非常的大,而且时间性比较强(正常情况下一个用户不会去查询几年前的交易记录),针对这种情况就可以采用Cache表的机制来提高流水的查询效率。 可以把客户在查询流水的过程中关注度比较高的字段单独的抽取成一张表(例如 时间,金额,交易地点….),这张表只包含几个月的数据,当用户查询流水时,如果要求查询的交易时间在Cache表的时间区间内,就从这张Cache表进行查询,否则去主表进行查询。

 

Counter

很多web应用中都有计数的功能,例如 博客系统一般都会统计好友的数目,发表的文章数,上传的文件数,以及文章的被浏览数。如果 应用中存在较多的计数器,在高并发时,很容易出现“写”的性能问题,针对这种情况可以采取把Counter的字段作为一张单独表的解决方案。

 

·         以博客网站的访问次数为例,最简单的计数器表是只包含单独的计数列

mysql>CREATE TABLE hit_counter (

->  cnt int unsigned not null

-> )ENGINE=InnoDB;

每当被访问时cnt就执行一次更新操作

mysql>UPDATE  hit_counter  SET cnt = cnt + 1;

·         当并发的数量比较大时,由于update是串行的操作,所以性能还是会受到影响,为了提高并发的Performance,  可以采用多条记录的方式来提高并发效率步骤如下

(1) 更改表结构

mysql>CREATE TABLE hit_counter (

->  slot tinyint unsigned not null primary key,

->  cnt int unsigned not null

-> )ENGINE=InnoDB;
(2) 执行更新操作时,根据并发的数量,随机的选择一条计数器记录(以100表记录为例)

mysql> UPDATE hit_counter SET cnt = cnt + 1WHERE slot = RAND() * 100;
(3) 用Sum(cnt)的方式得到总的访问数量

mysql>SELECT SUM(cnt) FROM hit_counter;

·         一种更为通用的做法是以“天”为单位对cnt进行维护,步骤如下

(1) 更改表结构

mysql>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;
(2) 插入的时候,如果发现当天的某个slot已经存在,则对其cnt进行更行

mysql>INSERT INTO daily_hit_counter(day, slot, cnt)

 ->  VALUES(CURRENT_DATE, RAND() * 100, 1)

->  ON DUPLICATE KEY UPDATE cnt= cnt + 1;

Summary, Cache,Counter表的使用会额外的表空间的开销。对于Summary, Cache表的内容可以使用Period脚本定期的进行清除或者是更新,对于Counter表可以定期的对已有的记录进行汇总,生成汇总记录后,只保留汇总记录。

 

 

 

 

作者:sun7545526 发表于2013-9-10 22:08:22 原文链接
阅读:812 评论:0 查看评论

相关 [性能 mysql 进化论] 推荐:

高性能MySql进化论(二):数据类型的优化_下

- - CSDN博客数据库推荐文章
在实际的应用程序中往往需要存储两种体积较大的数据,一种是较大的Binary数据,e.g. 一张10M的图片,另外一种是 较大的文本 e.g.一篇几万字的文章. 在Oracle中有BOLB和CLOB来应对这两种数据,而在MySQL中对应的是BLOB以及TEXT. 鉴于这两种数据类型的特殊性,在MySQL中对BLOB以及TEXT的存储和操作做了特殊的处理:.

高性能MySql进化论(四):Summary,Cache,Counter表的使用

- - CSDN博客数据库推荐文章
在实际的应用中,往往会定期的对一个周期内的系统数据进行统计分析. 例如某购物网站定期的统计商品在一个月/年期内的销售情况,如果采用扫描所有相关表的方式在某个时间点进行统计分析, 由于数据量很大,以及表结构的复杂,性能可能会是很大的问题. 针对这种情况可以通过使用Summary,Cache,Counter 数据表的方式来提高分析的效率.

高性能MySql进化论(一):数据类型的优化_上

- - CSDN博客数据库推荐文章
在数据库的性能调优的过程中会涉及到很多的知识,包括字段的属性设置是否合适,索引的建立是否恰当,表结构涉及是否合理,数据库/操作系统 的设置是否正确…..其中每个topic可能都是一个领域. 在我看来,在数据库性能提升关键技术中,对字段的优化难度相对较低且对性能的影响也非常的大. 由于Mysql支持的数据类型比较多,且每个类型都有其独特的特性,但是有时候在选择一个具体的数据类型时,往往都是随意的选择一个能用的类型,而不会考虑到这个类型是否是最优的.

MySQL 性能

- - 谁主沉浮
这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定. 使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差. 选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文).

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

Mysql性能优化

- - 数据库 - ITeye博客
MySQL性能优化.   性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间. 性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等.   数据库管理人员可以使用SHOW STATUS语句来查询MySQL数据库的性能. 语法:SHOW STATUE LIKE ‘value’;其中value参数是常用的几个统计参数.

mysql 5.6性能vs mysql 5.5的讨论

- - ITeye博客
这几天老外就mysql 5.6和5.5,MariaDB的benchmark讨论的很热烈,参考http://t.cn/zYoXNND一文,而法国朋友身先士卒,在http://t.cn/zYKgDmk中一连做了多个评测. 1) 在大名顶顶的percona公司的Peter Zaitsev 一文中(http://www.mysqlperformanceblog.com/2013/02/18/is-mysql-5-6-slower-than-mysql-5-5/).

mysql性能优化教程

- coolzsb - caoz的和谐blog

mysql性能最大化

- - CSDN博客数据库推荐文章
#跳过外部锁定 只对MyISAM. #禁用tcp socket连接,只能使用unix/linux socket连接. #禁用DNS解析,提高连接速度. #跳过授权表,忘记root密码时使用. #服务器关闭一个交互连接前等待的秒数,默认28800. #线程缓存数,直接利用空闲连接来创建新连接,1G  —> 8 2G  —> 16 3G  —> 32 >3G  —> 64.

MySQL性能建议者:mysqltuner.pl

- - CSDN博客数据库推荐文章
一些简单的命令可从 --help 查阅. 输出结果简单明了,读者有兴趣可参阅官网博客. 作者:linwaterbin 发表于2013-10-23 0:13:37 原文链接. 阅读:147 评论:0 查看评论.