• 大数据量下的存储设计模式探索


    引言

    现实世界商务竞争越演越烈,出现更多的细分市场、深度营销和定制功能,这导致各种商务应用的用户数和业务复杂度同步增加。反映到数据库里,就是表的数量和数据量日益增长,数据库响应速度日益缓慢。

    为什么一个功能好的产品,往往上线后就出现性能问题,不得不反复回炉修改?为什么一到业务高峰期,系统就慢的动弹不得,只能关闭部分业务保障关键业务?数据量从十万到百万,从百万到千万,从千万到上亿,从亿再向兆跨越,如何保障程序能够经受住大数据量的考验?这都是我们面临的真实现状,也是大家反复在思考的问题。

    《道德经》上说:“有道无术,术尚可求,有术无道,止于术。”众人把目光集中在系统架构、查询算法、数据库软件的底层原理等等“术”上,却忽视了深刻理解数据这条光明大“道”。数据从哪里来?要到哪里去?数据用来读还是写?数据与数据之间有什么样的关系?数据的增长速度如何控制?最有价值的数据是什么?数据什么时候可以丢弃?假如不能回答这一长串问题,如果不是以这一长串问题的答案为程序设计的出发点,代码如何能经受大数据量的考验?

    在数据的采集、计算、展现和存储这一设计链条中,开发者通常负责设计关系型数据模型,编写程序计算和展现数据,数据库管理员负责数据文件存放位置、表空间存储参数等的架构设计。但是,数据库管理员往往不了解业务,不了解数据的特点,数据存储设计表现为千“表”一律。

    数据存储设计模式是根据数据的真正特点,仔细分析数据流向、数据访问特点、数据量、数据增长量和数据生命周期,对数据进行分类,然后根据不同类型的数据设计不同的存储策略。正确的应用数据存储设计模式,可以几倍,甚至几十倍的提高数据访问效率。

    大数据量下的数据特点

    全球最大数据库的数据量已经先后越过了MB量级、GB量级和TB量级,站到了PB量级的门口。在庞大的数据量面前,对数据进行分类显得尤为重要。人们对数据感兴趣的时间是不一样的,大量的数据进入数据库后,经过计算、聚集和转换,仅有少量的活跃数据需要长期保留在数据库中,剩下的数据只有备查的价值,可以暂时存储在数据库中或者离线备份,等到休眠数据完全没有价值后直接删除。

    需要长期保留在数据库的活跃数据可以称之为核心数据,它是整个商业活动中最有价值的数据,需要长期甚至永久的保留。程序完成处理后只需要备查的休眠数据可以称之为过程数据,是伴随核心数据流动所产生的数据,它的存在周期视商业活动的重要性而定。

     

    数据的分类有利于把资源聚焦于有价值的数据,我们可以通过以下几个方面识别核心数据和过程数据:

    识别项

    核心数据

    过程数据

    数据流向

    几乎不流动

    按工作流的方式运动

    数据的访问特点

    主要读,多半是关联查询

    主要写,更新和删除涉及到查询

    数据量

    非常大

    数据的增长量

    增长缓慢或者完全不增长

    增长迅速,甚至是爆发性的

    数据生命周期

    长,甚至永久的保留

    短,几天到几个月不等

     

    在大数据量环境下,数据库服务器的资源是昂贵的,混合核心数据和过程数据的后果就是资源被不重要的数据占用,被不必要的进程占用,导致性能缓慢和堵塞。常见的误解数据特点的现象包括:

    l           核心数据和过程数据以不同字段的形式在同一条记录里存放

    l           核心数据和过程数据以不同记录的形式在同一张表里存放

    l           把不同队列的过程数据在同一张表里存放

    l           过程数据没有合适的退出机制,长期保留在数据库中

    数据表的分类

    在一个大数据量环境中,表的数量往往达到数千张。根据核心数据和过程数据的不同特点,可以将表大致分为2个大类,4个子类。

      

    核心表及子类的明细定义如下:

    表类型

    表说明

    核心表

    数据生命周期长,读比写的访问频率高,数据增长慢

    恒数表

    数据量小,总是读,很少写

    递增表

    数据量大,经常读,很少写。某些情况会频繁写。

     

    在核心表的关系型数据模型设计阶段,有以下原则需要遵守:

    l           务必要尊重范式,即确保原子性,检查对键的依赖性,检查属性独立性等三个原则。

    l           严格控制关键递增表的字段个数和字段长度。

    l           重要的递增表的属性一旦定义,不允许随意添加字段。后续业务升级最好是增加新的递增表。

    l           如果递增表总是需要做范围查询,应重新审视关系型模型。

     

    过程表及子类的明细定义如下:

    表类型

    表说明

    过程表

    数据生命周期短,写比读的访问频率高,数据增长快

    流水表

    数据量大,经常写,很少读。只插不改,定期删。

    状态表

    数据量大,经常写,经常读。边插边改边删。

     

    在过程表的关系型数据模型设计阶段,有以下原则需要遵守:

    l           设计明显的代表数据生命周期终止的字段

     

    l           从增删改的代价来考虑,插入代价最小,修改需检索数据,删除最为昂贵,可考虑多设计流水表,少设计状态表。

     

    数据表的分类有利于围绕不同类型的数据进行不同的存储模式设计。我们可以通过数据流向、数据访问特点、数据量、数据增长量和数据生命周期等识别四种表类型:

     

    识别项

    恒数表

    递增表

    流水表

    状态表

    数据流向

    几乎不流动

    数据很少流动

    数据不流动

    数据在不同的表之间流动

    数据的访问特点

    读很频繁,很少写

    读很频繁,很少写,每次仅访问表中的极少量数据

    只插不改不删,数据生成后只用来备查

    读和写都很频繁,不光是插还要改和删

    数据量

    数据量小,一般在万条以内

    数据量大,一般在几万条到上亿条以内

    数据量很大,一般在几十万条到上亿条以内

    数据量很大,一般在几千条到上千万条以间

    数据的增长量

    几乎不增长

    增长缓慢

    增长快

    增长快

    数据生命周期

    很短

    4  存储参数设计(略) 

    5  数据存储模式的设计(略)

    6  成功应用数据存储模式的步骤(略)

    原文链接 :http://labs.chinamobile.com/mblog/100128_48277

     

    大数据量的系统的数据库结构如何设计

    1、把你表中经常查询的和不常用的分开几个表,也就是横向切分
    2、把不同类型的分成几个表,纵向切分
    3、常用联接的建索引
    4、服务器放几个硬盘,把数据、日志、索引分盘存放,这样可以提高IO吞吐率
    5、用优化器,优化你的查询
    6、考虑冗余,这样可以减少连接
    7、可以考虑建立统计表,就是实时生成总计表,这样可以避免每次查询都统计一次
    8、用极量数据测试一下

    数据仓库解决的是数据挖掘,共享,和大数据量存储有什么根本关系?
    mrzxc 等说的好,考虑你的系统,注意负载平衡,查询优化,25 万并不大,可以建一个表,然后按mrzxc 的3 4 5 7 优化。


    速度,影响它的因数太多了,且数据量越大越明显。
    1、存储
    将硬盘分成NTFS格式,NTFS比FAT32快,并看你的数据文件大小,1G以上你可以采用多数据库文件,这样可以将存取负载分散到多个物理硬盘或磁盘阵列上。

    2、tempdb
    tempdb也应该被单独的物理硬盘或磁盘阵列上,建议放在RAID 0上,这样它的性能最高,不要对它设置最大值让它自动增长

    3、日志文件
    日志文件也应该和数据文件分开在不同的理硬盘或磁盘阵列上,这样也可以提高硬盘I/O性能。

    4、分区视图
    就是将你的数据水平分割在集群服务器上,它适合大规模OLTP,SQL群集上,如果你数据库不是访问特别大不建议使用。

    5、簇索引
    你的表一定有个簇索引,在使用簇索引查询的时候,区块查询是最快的,如用between,应为他是物理连续的,你应该尽量减少对它的updaet,应为这可以使它物理不连续。

    6、非簇索引
    非簇索引与物理顺序无关,设计它时必须有高度的可选择性,可以提高查询速度,但对表update的时候这些非簇索引会影响速度,且占用空间大,如果你愿意用空间和修改时间换取速度可以考虑。

    7、索引视图
    如果在视图上建立索引,那视图的结果集就会被存储起来,对与特定的查询性能可以提高很多,但同样对update语句时它也会严重减低性能,一般用在数据相对稳定的数据仓库中。

    8、维护索引
    你在将索引建好后,定期维护是很重要的,用dbcc showcontig来观察页密度、扫描密度等等,及时用dbcc indexdefrag来整理表或视图的索引,在必要的时候用dbcc dbreindex来重建索引可以受到良好的效果。

    不论你是用几个表1、2、3点都可以提高一定的性能,5、6、8点你是必须做的,至于4、7点看你的需求,我个人是不建议的。

      

     程表的关系型数据模型设计阶段,有以下原则需要遵守

    
    原文链接 :http://www.cnblogs.com/ronli/archive/2009/05/14/1456582.html
  • 相关阅读:
    群发邮件2
    谈谈C#中的三个关键词new , virtual , override
    一个简单的jQuery插件ajaxfileupload实现ajax上传文件例子
    网站静态化结构
    第四十七章 天神的邀请
    asp.net 异步群发邮件时遭遇到的问题 ddddddddd
    第四十章 远方的消息
    商用群发p2p网络
    第四十八章 三大客卿
    第四十五章 你没让我失望
  • 原文地址:https://www.cnblogs.com/dragonstreak_1/p/2088434.html
Copyright © 2020-2023  润新知