数据库表的性能问题

 

最近一家客户的协同OA系统中频繁发生前一个用户处理后(无错误提示),后一个用户无法看到待办的情况,在流程图中,可以看到下一个节点的岗位,如财务经理,但不出现具体的人员姓名。表面的原因是流程记录表中未正常添加数据导致,手工添加了数据后可正常处理。但是,为何流程记录表总是无法正常添加呢?之前系统一直是正常的,近一个多月开始发生问题,这几天问题变得很普遍。日志中也无法找到有用的信息。
 
    该协同系统使用的Mysql数据库,采用MyISAM 引擎,该方式不支持事务,但速度较快(另一种为InnoDB,支持事务),个人感觉这种设置不是太好,因为协同中很多的操作都由多个表的操作构成,例如处理待办,至少要处理7、8张表,任何的错误都应该进行事务的回滚,但MyISAM不支持事务,这就为客户的问题种下了祸根。
 
该客户在多个城市有分公司,并且由于公司管理非常严格,表单的数量非常多,在生产机上数据库的大小已经达到了十几G,并且有一张单表的数据达到了6G多,该表中的数据量达到了千万级。
 
通过以上分析,个人感觉目前客户的系统中,Mysql的性能已经达到了崩溃的边缘,无论是数据库大小还是单表的数量级,都已经无法承受了。但是为什么数据表会那么大呢?经过分析,发现该表用于记录审批流程中节点(个人)与表单字段之间的权限设置,是可修改、只读还是不可见。举例来说,表单A有20个字段,审批流程有10个人参与,那么该表中就会有对应的200条数据。在表单数量达到几十万的情况下,该表数据上千万就一点都不奇怪了。
 
由此也想到我们公司开发的各种系统,都或多或少的存在着类似的性能问题,根据个人的开发经验,总结了一下针对数据性能的设计思路,具体如下:
 
1、归档历史数据,其实这个思路在财务系统中非常普遍,就是我们常听到的账套的概念,每年都新建立一个账套(数据库层面是建立了一个新的库),将基础信息复制到新帐套,业务数据表都是全新的。客户需要查询历史数据的时候,登陆到老的账套去查询就可以了。这种方式很好的解决了数据积累的问题,特别适用于历史数据仅用于少量查询的系统,当然这种处理方式使得跨年度的统计分析变得不太方便,因为历史数据分布在不同的物理库里,需要有专门的库表存储汇总数据。
 
2、将较大的表中的字段根据使用的频率分离为多张数据表,这种横向拆分的方式在大并发的网站或电子商务系统中非常常见。例如在存储网站文章的表中,文章标题、作者、内容这些是会被高频次的读取的,但改动的机会则比较少;而文章的访问次数则会被不断的更新。把访问次数分离出来单独存储一张表,在数据量大的情况下,对于提高相关部分的性能是非常有帮助的。
 
3、除了横向的拆分外,纵向的数据表拆分同样在大并发的系统中经常被使用。例如用户表,我们可以根据用户名的首字母,准备3-5张用户表,分别存储不同首字母打头的用户信息(当然它们的结构都是一样的)。在用户登录的时候,根据首字母到不同的用户表中进行校验。这样,单个的数据表中的数据记录行数少了,对于性能的帮助也是很大的。当然也会带来不少副作用,比如统计报表方面,呵呵,这就需要对结构进行很好的设计了。
 
4、如果条件允许,可以多挂几个硬盘,把数据表、日志、索引等都放到不同的硬盘上,这样也能够增加硬盘IO的速度,从而提高读写的性能。在SQL的优化方面,往往也都有很大的潜力可挖,例如适当的索引、数据的冗余等,不要考虑存储量,这个早就不是问题了。如果可能,应该尽量减少常用查询中连接的数据表的数量,这样做的效果其实是非常明显的,两个记录数都很大的数据表的连接查询的结果几乎就是灾难性的。索引的建立应该足够谨慎,太多的索引反而会对插入和更新操作造成巨大的负担,根据你的查询来逐一建立索引是比较好的做法,在SQL查询语句中,先写那些类似于type=1的条件、不要随意使用in语句,都会对性能有所帮助。
 
5、为复杂的报表准备中间表是很好的习惯,你可以实时去做这种数据的准备,如果确实太耗时,每天晚上定时处理也是普遍采用的做法。
 
6、如果客户的硬件支持,那么使用集群个人觉得效果是最好的,比起以上的各种都更加有效果,但配置和维护都比较繁琐。
 
7、缓存的使用,对性能会有相当的帮助。你需要根据数据的性质设置不同的缓存机制。例如,在系统启动的时候,载入基础数据,如组织、人员、枚举等,这样做对系统的性能帮助是很大的,当然,不要忘记在适当的时候更新你的缓存。
 
8、一定要做性能测试,它能够帮助你找到有问题的部分,可以有针对性的处理。
 

以上是个人的一些经验的总结,关键还是在系统设计之初就重视性能的问题,对各种可能性都有相应的预估和应对,这样就不会在上线前后再去拼命的优化,这个时候付出的代价往往要大得多,效果也不见得会太好。

 

作者:上海秀群信息技术有限公司首席架构师 孙珂

 













© 2010-2012 Cherish Information Technology. All rights reserved.
沪ICP备05009269号
电 话:021-5657-5270    邮 箱:service@cherish.com.cn    地 址:上海市宝山区长江南路180号长江软件园C栋110-117室

友情链接:

 乐学院    复旦商业知识在线    每日乐英语    创意发声    中国彩色宝石网     圆周率品牌机构    
唐山松下产业机器    欧莱雅(中国)     上海市互联网经济咨询中心    中电投电力工程有限公司     文汇网    
上海教育新闻网    上海市软件测评中心