高性能MySql进化论(四):Summary,Cache,Counter表的使用
在实际的应用中,往往会定期的对一个周期内的系统数据进行统计分析。例如某购物网站定期的统计商品在一个月/年期内的销售情况,如果采用扫描所有相关表的方式在某个时间点进行统计分析, 由于数据量很大,以及表结构的复杂,性能可能会是很大的问题。针对这种情况可以通过使用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表的使用的更多相关文章
- 高性能MySql进化论【转】
高性能MySql进化论(十二):Mysql中分区表的使用总结 http://binary.duapp.com/category/sql 当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引 ...
- 高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式 1 COUNT 1. COUNT的作用 · COUNT(table.filed)统计的该字段非空值的记录行数 · ...
- 高性能MySql进化论(九):查询优化器常用的优化方式
1 介绍 1.1 处理流程 当MYSQL 收到一条查询请求时,会首先通过关键字对SQL语句进行解析,生成一颗“解析树”,然后预处理器会校验“解析树”是否合法(主要校验数据列和表明 ...
- 高性能MySql进化论(一):数据类型的优化_上
在数据库的性能调优的过程中会涉及到很多的知识,包括字段的属性设置是否合适,索引的建立是否恰当,表结构涉及是否合理,数据库/操作系统 的设置是否正确…..其中每个topic可能都是一个领域. 在我看来, ...
- 高性能MySQL(四)
Schema与数据类型优化 需要优化的数据类型 更小的通常更好 简单就好 尽量避免NULL 整数类型 存储整数,有TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT,分别使用8 ...
- 高性能MySQL(四):schema陷阱
一.schema陷阱 二.缓存表和汇总表 三.范式和反范式
- schema与数据类型优化-高性能mysql
总结作为开发人员重点注意的内容!这是一篇有关高性能MYSQL第四章schema相关的笔记. 0.前言 在项目中,数据库表列有两个text字段,用来存储大文本,在数据规模达到40万后,如果查询没命中索引 ...
- MySQL优化四(优化表结构)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- 《高性能MySQL》笔记——MySQL建表数据类型的选择
前段时间看了<高性能MySQL>中的选择优化的数据类型,这里主要是做一下笔记. 首先数据选择有几个简单原则: 更小的通常更好.一般情况下,应该尽量使用可以正确存储数据的最小数据类型.例如只 ...
随机推荐
- Qt见解:Post 与 Get 的区别(Get将参数直接与网址整合为一个整体,而Post则将其拆为两个部分)
第一次接触Qt的Http项目,今天看了一下Post和Get的基本使用方法,就开始尝试了.原先以为Post专门用于向服务器发送请求,然后接收服务器应答的: 而Get只是单纯从服务器获取资源,比如下载这个 ...
- 统计单词频率--map
问题描述: 输入一个单词列表,每行一个单词,统计单词出现的频率 思路: 主要是使用c++中的map容器.map实质上是一个二叉查找树,可以做到插入.删除.查询,平均查询时间在O(logn).n为map ...
- 数据结构——链表(linkedlist)
基本分类: 1.单向链表 2.带尾指针的单向链表 3.双向循环链表 以下分类进行说明 1.单向链表 基本元素:*front //头节点 *next //下一节点 声明:node<T>*p; ...
- More Divisors(反素数)
More Divisors Time Limit: 2 Seconds Memory Limit: 65536 KB Everybody knows that we use decimal ...
- C++_01_入门
一.类的定义 Person.h类声明 Person.cpp类实现 main.cpp主函数 二.命名空间的使用 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv ...
- 自定义ActionBar背景(分别针对3.0以下和3.0以上的版本)
官方原文:http://developer.android.com/training/basics/actionbar/styling.html 针对3.0以上的版本: <?xml versio ...
- grub2的/etc/default/grub文件详解
# If you change this file, run 'update-grub' afterwards to update# /boot/grub/grub.cfg.GRUB_DEFAULT= ...
- Android百度地图之显示地图
添加地图显示 一.在百度官网下载相关的SDK (网址:http://developer.baidu.com/map/sdkandev-download.htm) 解压下载好的BaiduMap_Andr ...
- Javascript 运动基础 01
JS运动基础 运动基础 让Div运动起来 速度——物体运动的快慢 运动中的Bug 不会停止 速度取某些值会无法停止 到达位置后再点击还会运动 重复点击速度加快 匀速运动 速度不变 <s ...
- 笔记之Cyclone IV 第一卷第一章FPGA 器件系列概述
因为本人用的黑金四代开发板,中央芯片采用ALTERA的cycloneIV E,所以就此器件阅读altera官网资料,并做相应的笔记,以便于以后查阅 Cyclone IV 器件系列具有以下特性:■ 低成 ...