Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58211
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-08 11:31
个人简介

由于我自己也刚刚学会系统编程不久,所以分享的很多都是很基础的东西,希望能够对你有所帮助

文章分类
文章存档

2013年(11)

我的朋友

分类: 大数据

2013-07-11 11:53:47

 一、数据库结构的设计 

    首先设计一个合理的数据库模型,不仅会减少客户端和服务器段程序的编程和维护的难度,而且将会大大增加系统实际运行的性能。所以,在一个系统开始实施之前,必须完备的数据库模型的设计。

二、查询的优化   

保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM T1;在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。     

在没有建索引的情况下,数据库查找某一条数据,就必须进行全表扫描了,对所有数据进行一次遍历,查找出符合条件的记录。 

 

三、算法的优化   

 

尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。  

  游标提供了对特定集合中逐行扫描的手段,一般使用游标逐行遍历数据,根据取出的数据不同条件进行不同的操作。尤其对多表和大表定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等特甚至死机。   

  在有些场合,有时也非得使用游标,此时也可考虑将符合条件的数据行转入临时表中,再对临时表定义游标进行操作,可时性能得到明显提高。封装存储过程  

 

四、建立高效的索引  

 

  创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。大型数据库有两种索引即簇索引和非簇索引,一个没有簇索引的表是按堆结构存储数据,所有的数据均添加在表的尾部,而建立了簇索引的表,其数据在物理上会按照簇索引键的顺序存储,一个表只允许有一个簇索引,因此,根据B树结构,可以理解添加任何一种索引均能提高按索引列查询的速度,但会降低插入、更新、删除操作的性能,尤其是当填充因子(Fill Factor)较大时。所以对索引较多的表进行频繁的插入、更新、删除操作,建表和索引时因设置较小的填充因子,以便在各数据页中留下较多的自由空间,减少页分割及重新组织的工作。   

索引是从数据库中获取数据的最高效方式之一。95% 的数据库性能问题都可以采用索引技术得到解决。作为一条规则,我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列[字段]采用非成组索引。不过,索引就象是盐,太多了菜就咸了。你得考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。   

  其他注意事项   

“水可载舟,亦可覆舟”,索引也一样。索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。    

所以说,我们要建立一个“适当”的索引体系,特别是对聚合索引的创建,更应精益求精,以使您的数据库能得到高性能的发挥  

 

解决方案:建立中间表,通过DTS调度每天共步数据。   

中间表设计原则   

记录数同原表一样,减少多表连接,保存运算好的值,如果记录修改,根据修改日志,重新计算中间值   

 

 

增量同步数据(DTS)   

直接从每天的数据库更改日志读取记录,更新中间表,根据服务器空间程度合理调度DTS,减少数据同步时间。   

 

对中间数据进行运算   

查询不作字段运行,所以运算在生成中间表的过程中已经计算   

 

根据查询,优化索引设计   

根据数据查询特性,对where ,GROUP BY等操作字段进行索引设计,提高查询速度   

 

优化数据类型   

大量采用Int提高查询、统计速度   

 

优化中间表关键字   

采用Int,提高插入速度   

 

 

数据文件优化设计,一个主要业务,一个数据文件,建数据文件时,估计数据量,一次建一个比较大的文件,这样所分配的文件就是一个连续文件块。 

 

五、JVM调优

系统采用的是Java+Tomcat+Mysql,可以对Java虚拟机JVM进行配置优化。JVM一般现在的垃圾回收都是采用的分代回收的方式实现的。配置Java –Xmx3800m –Xms3800m –Xmn2g –Xss128k –XX:+UseParallelGC –XX:ParallelGCThreads=20 配置内存和并发能力。详细配置不做描述了。JVM调优要现场运维测试调优。

六、缓冲池技术

对于40万的用户量系统是不能避免的会承载最大限度40万同时在线预计是最多40万同时在线参与投票。对于三个流程是耗费资源最多的时候进行缓冲池处理,一个流程是用户登录时,用户名密码的验证;第二个流程就是用户投票的时间段系统承受的访问的量,第三个流程就是消息推送,采用多线程对于要推送的用户进行排队推送。

七、页面静态化技术和负载均衡技术

用户提交数据是采用局部刷新,即只提交用户需要用到的,一些不改变的数据就不需要进行提交和下载。

(1)       采用负载均衡处理客户端的请求,能够解决上千万的请求并发处理。

该章描述一些处理系统大并发的概要方案,通过测试的数据说明方案的可行性。Mysql数据库采用SELECT * 全查询50万条查询时间1.130秒的时间。

 

 

 

 

 

在数据库直接运行sql语句查询id需要0.564秒,而java中采用数据库连接查询52万条数据花费的时间是2.776秒时间。

 

 

数据库采用sql语句用时图

 

 

 

 

 

 

                   采用java操作数据库查询全部id用时

采用优化后登录验证只需要1.070秒的时间,这样大用户量登录根本就不是问题。

 

 

 

八、ehcache缓存技术+LRU等淘汰算法

 

由于本系统是高并发,大数据量,高性能的系统。所以cache(缓存)起到了非常重要的作用,ehcache是一个纯Java的进程内缓存框架,具有快速、精干等特点。原来使用过多种基于Java的开源Cache组件,其中包括OSCache、JBossCache、EHCache。OSCache功能强大,使用灵活,可用于对象缓存、Filter缓存以及在JSP中直接使用cache标签。在最近的使用过程中发现,在并发量较高时,OSCache会出现线程阻塞和数据错误,通过分析源代码发现是其内部实现的缺陷。JBossCache最大的优点是支持基于对象属性的集群同步,不过JBossCache的配置使用都较复杂,在并发量较高的情况下,对象属性数据在集群中同步也会加大系统的开销。EHCache是来自sourceforge()的开源项目,也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件。同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用Gzip压缩提高响应速度。

九、commons-pool

 

 创建新的对象并初始化的操作,可能会消耗很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于20,000千米以外的主机上读出一 些数据)的时候,尤其是这样。在需要大量生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问题,除了选用更好的硬件和更棒的虚拟 机以外,适当地采用一些能够减少对象创建次数的编码技巧,也是一种有效的对策。对象池化技术(Object Pooling)就是这方面的著名技巧,而Jakarta Commons Pool组件则是处理对象池化的得力外援。

阅读(2191) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~