在实际的应用中,往往会定期的对一个周期内的系统数据进行统计分析。例如某购物网站定期的统计商品在一个月/年期内的销售情况,如果采用扫描所有相关表的方式在某个时间点进行统计分析, 由于数据量很大,以及表结构的复杂,性能可能会是很大的问题。针对这种情况可以通过使用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表可以定期的对已有的记录进行汇总,生成汇总记录后,只保留汇总记录。

 

高性能MySql进化论(四):Summary,Cache,Counter表的使用的更多相关文章

  1. 高性能MySql进化论【转】

    高性能MySql进化论(十二):Mysql中分区表的使用总结 http://binary.duapp.com/category/sql 当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引 ...

  2. 高性能MySql进化论(十一):常见查询语句的优化

    总结一下常见查询语句的优化方式 1        COUNT 1.       COUNT的作用 ·        COUNT(table.filed)统计的该字段非空值的记录行数 ·         ...

  3. 高性能MySql进化论(九):查询优化器常用的优化方式

    1        介绍 1.1     处理流程 当MYSQL 收到一条查询请求时,会首先通过关键字对SQL语句进行解析,生成一颗“解析树”,然后预处理器会校验“解析树”是否合法(主要校验数据列和表明 ...

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

    在数据库的性能调优的过程中会涉及到很多的知识,包括字段的属性设置是否合适,索引的建立是否恰当,表结构涉及是否合理,数据库/操作系统 的设置是否正确…..其中每个topic可能都是一个领域. 在我看来, ...

  5. 高性能MySQL(四)

    Schema与数据类型优化 需要优化的数据类型 更小的通常更好 简单就好 尽量避免NULL 整数类型 存储整数,有TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT,分别使用8 ...

  6. 高性能MySQL(四):schema陷阱

    一.schema陷阱 二.缓存表和汇总表 三.范式和反范式

  7. schema与数据类型优化-高性能mysql

    总结作为开发人员重点注意的内容!这是一篇有关高性能MYSQL第四章schema相关的笔记. 0.前言 在项目中,数据库表列有两个text字段,用来存储大文本,在数据规模达到40万后,如果查询没命中索引 ...

  8. MySQL优化四(优化表结构)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  9. 《高性能MySQL》笔记——MySQL建表数据类型的选择

    前段时间看了<高性能MySQL>中的选择优化的数据类型,这里主要是做一下笔记. 首先数据选择有几个简单原则: 更小的通常更好.一般情况下,应该尽量使用可以正确存储数据的最小数据类型.例如只 ...

随机推荐

  1. linux常用命令加实例大全

    目  录引言    1一.安装和登录    2(一)    login    2(二)    shutdown    2(三)    halt    3(四)    reboot    3(五)    ...

  2. 基于Bresenham算法画圆

    bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...

  3. Linux 静态库与共享库的使用

    申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...

  4. git 使用过程(一、准备工作)

    没有多余的废话,只是纯粹的捞干的记录下一自己使用Git的过程.(正在学习中,也是刚接触,记录过程可能有点乱.等熟悉之后在重新整理一下) 一.先下载git客户端 网址:http://msysgit.gi ...

  5. java字符串输出

    package mytest; public class Mycode { public static void main(String[] args){ String[]seasons = {&qu ...

  6. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  7. JVM 指令集合

    指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int ...

  8. 面向对象程序设计-C++ Operator Overloading & Type conversion (Static)【第十一次上课笔记】

    本次上课继续讲解了 [ ] .-> 等运算符重载的具体例子 也讲解了C++单个参数的类的类型转换的案例 最后稍微提到了 static 的第三种作用:静态数据成员 具体详解我都已注释出来了,大家可 ...

  9. 一个RPC的demo

    从下面的例子中可以看到,Consumer(client)的代码中引用了Provider部分的class,本例中是 com.provider.EchoServiceImpl和com.provider.E ...

  10. Solr4.7从数据库导数据

    实际工程应用中,从数据库导出数据创建索引再常见不过了,现在实验一下从数据库导入数据创建索引. 一.版本说明 Solr版本:4.7.0 数据库:sqlserver2005 二.配置步骤 1.  准备的j ...