海量数据分布式存储与检索优化分析研究

2013-05-09 05:59邓平李红育宁东玲
网络安全技术与应用 2013年4期
关键词:海量语句分布式

邓平 李红育 宁东玲

1云南财经大学信息学院 云南 650000

2云南工商学院软件学院 云南 651700

0 引言

互联网时代的Web系统在企业中的大量应用,随之而来的数据高速膨胀,使得海量数据的处理和检索问题变的异常复杂。要存储和处理海量信息,不仅需要有高速的网络基础设施,还需要处理海量信息的计算和存储平台,为了能高效可靠的存储和处理PB级的海量数据,对数据的存储计算及检索优化技术应运而生。

1 分布式数据存储

在分布式数据库中,由于数据的分布和冗余,使得查询处理中需要考虑站点间传输数据的通信费用,所以除了考虑CPU代价和I/O代价之外,还应该包括数据在网络上的传输代价。即总代价=CPU代价+I/O代价+通信代价。因此,分布式数据库进行分布式设计时,一个重要原则是使数据和应用程序实现最大程度的本地性,这样就可以使应用数据尽可能地本地化,以减少通信开支。对于建立在各场所的分布式数据库,不需要过分进行限制,但也必须要有规范的设计要求。

(1)硬件规范,必须支持局域网乃至Internet的包括声音,文字,图像的交流,支持IE或Netscape浏览web界面,支持开放性数据源的建立。

(2)数据库形式规范,原则上Access、Paradox,甚至文本文件都可以进行数据传输,但必须保证自己有开放式数据源的特征及关系继承的特征。

(3)域的统一和分类、分科的统一,数据库在各个分布场所必须有统一的域结构,以确保给用户提供完整统一的视图,科目分类的命名必须要求规范,以确保查询和统计工作的准确性,在方便工作的条件下,可以不要求唯一确定的主关键字。

数据库服务器级,就是利用多台数据库服务器对数据进行存储。首先来看案例:我国目前有13多亿人口,现在要开发一个系统,能够根据身份证号检索出该人的详细信息。对于这种海量数据的系统,最有效的方式就是从数据库服务器级进行数据的分类存储。如:我国居民身份证是由18位数字或字母组成,这些数字和字母都有实际意义,其中的前6位是行政区划码,可以把不同行政区划的公民信息存储到不同的数据库服务器上,同时在系统中建立一个字典表,如表1所示。

表1 数据库服务器字典表

当输入身份证号码时,首先根据其前4位来检索其行政区划,然后再连接到其所对应的数据库服务器进行检索。

这种方式带来的查询结果是最高效的,数据存储与查询的优化速度可以提升到10的次方级以上。

2 动态表

通常情况下,数据库中的表是固定的。但有时,在系统的实际运行过程中通过动态生成表却能对大数据量的存储与检索起到不错的效果。例如,要为某大学开发学工系统,系统要能够对学生的日常操行进行记录。在系统中必然要有一张表来记录学生的日常行为,而问题是对于上万人的大学,每天将有上万条的记录,而这些信息起码要保存4年,数据将达到10000(人)X 300(天)X 4(年)=12000000条,如何能够快速检索出其中某个学生的操行记录呢?

在系统开发中,可以采用动态表的形式来提升数据的检索效率。具体做法是,系统中存在班级信息表,结构如表2所示。

表2 班级信息表

改进后的表3中添加了一列,叫做【操行记录表】,该列是在添加班级信息时动态按照命名规则生成的,同时在数据库中,也添加了一张表,即对应的操行记录表,该表用来保存该班级的操行信息。对于一个近万人的大学,假如每个班级按照50人核算,那么动态表的应用就把操行记录表的数据量缩小了近200倍,检索效率也提升了近百倍。

表3 班级信息表

3 索引

索引是关系数据库中非常重要的对象,但大家往往忽略了索引对数据检索的影响,这种影响在大型的或复杂的数据库中尤为明显。

下面将通过实际的数据检索来给出实验结果。测试的环境为:主机HP Compaq 6515b;内存:2G;操作系统:Windows xp;数据库:Microsoft SQL Server 2008。

首先,创建如图1所示数据表。其次,向表中插入100万条数据记录。然后,通过如下SQL语句对检索效率进行测试。

图1 数据表结构

declare @begin datetime

set @begin = getdate()

select count(*)from T_record where

pubdate > '2012-01-04 15:58:00' and

pubdate < '2012-01-04 16:12:00'

print(datediff(ms,@begin,getdate()))

(1)索引对比

当采用默认索引执行上述SQL检索时,耗时为373ms;当为pubdate列添加一个非聚集索引时,耗时为156ms;当将默认的聚集索引删除,同时指定pubdate为聚集索引时,耗时为123ms。

虽然三种检索的耗时都没有超过1秒,但从结果可以发现第1种方式的耗时几乎为后面第2种方式的2倍还多,而第3种方式最短。

分析:同样的SQL检索语句,由于第1种方式下,虽然指定了id为主键,创建了一个聚集索引,但由于检索中并不根据id编号进行检索,所以该聚集索引等于没有;而第2种方式时,为pubdate列创建了非聚集索引,其检索用到了索引,从而提升了检索效率;而第3种情形,为pubdate列创建聚集索引,而聚集索引是一种物理存储与逻辑存储一致的索引方式,故其检索效率进一步得到了提升。

(2)组合索引

首先,在pubdate、publisher两列上创建组合索引,然后执行如下SQL语句。

declare @begin datetime

set @begin = getdate()

select count(*)from T_record where

publisher in('u_1000','u_400000')

print(datediff(ms,@begin,getdate()))

执行检索共耗时1033ms,然后,对进行索引修改,还是为pubdate和publisher创建组合索引,但顺序调整为publisher、pubdate,然后执行检索共耗时16ms,几乎为0。

分析:虽然都是在pubdate和publisher上创建的组合索引,但由于第一次的前导列是pubdate,但在查询中并没有用到pubdate列,所以组合索引没有被使用,而第二次的前导列是publisher,检索用到了索引,大大提升了效率。

总结一下,索引使用需要注意以下几点:

① 聚集索引是很宝贵的,一定要用到最合适的列上;

② 经常同时存取多列,可考虑建立组合索引;

③ 组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

4 查询语句优化

通常,检索只要能够检索到数据即可,而忽略了语句写法不同对效率的影响。总的说来,在进行检索时,应遵循的基本原则是尽量避免全表扫描。具体的来说就是需要注意以下几点:

① 尽量避免在where子句中对字段进行null值判断;

② 优先考虑在where及order by涉及的列上建立索引;

③ 尽量避免在where子句中使用!=或<>操作符;

④ 尽量避免使用or来连接条件;

⑤ 尽量避免在where子句中对字段进行表达式或函数操作。

5 结束语

根据分布式数据存储、动态表、索引、查询语句优化等4个方面对海量数据的存储与检索分析得知,四者的有效结合可以极大的提高数据的存储与检索效率。因此,在实际应用中,系统设计人员可以将这四者有机的结合起来,使之与IT系统部署在一起,从而能高效处理海量数据与检索查询。

[1]Tom White.Hadoop: The Definitive Guide.O’Reilly Media,Inc.2009.

[2]田颖,许鲁.分布式文件系统中的负载平衡技术.计算机工程.2003.

[3]Sun Microsystems,Inc.Lustre File System: High- Performance Storage Architecture and Scalable Cluster File System.www.sun.com.2007.

[4]陈晓明.分布式数据库分片关系变换查询优化[J].电子设计工程.2011.

[5]陈殿伟.基于Hadoop的虚拟筛选海量数据存储及结果处理的设计和实现[D].兰州大学.2012.

[6]谭怀远.让Oracle跑得更快2——基于海量数据的数据库设计与优化.电子工业出版社.2011.

猜你喜欢
海量语句分布式
一种傅里叶域海量数据高速谱聚类方法
重点:语句衔接
海量快递垃圾正在“围城”——“绿色快递”势在必行
分布式光伏热钱汹涌
分布式光伏:爆发还是徘徊
一个图形所蕴含的“海量”巧题
基于DDS的分布式三维协同仿真研究
一种海量卫星导航轨迹点地图匹配方法
西门子 分布式I/O Simatic ET 200AL
如何搞定语句衔接题