一种靠谱的系统性能优化方案-建立中间表
一、问题由来
最近项目中隔三差五的爆出OOM的问题。OOM的全称是Out Of Memory,也就是常说的内存溢出。公司的项目后端服务器使用的Java语言
开发的,JDK大版本选用的是1.8,小版本不做限制,数据库用的GBase,和Mysql类似。这个问题出现后,给项目的使用造成了很严重的影
响,比如访问速度非常慢,有的时候项目甚至会挂掉,只得重启项目。鉴于问题的严重性,所以当前大家最紧迫的任务就是解决这个问题。
二、问题分析
前两次报出这个问题的时候,项目经理找其他两个人根据请求路径去跟踪代码,发现了问题所在。导致OOM这个问题的原因是查询中返回了
大量的数据,据了解那个查询有一千万左右的数据;查询出来后再到代码中进行各种复杂的统计、计算操作,最终出现Java内存溢出错误。至
此问题的原因已经清晰明了,一次性查询的数据过多,并且还要对大量数据进行处理所以出现问题。
三、解决方案
方案一:
针对上诉问题,前两次的解决方案一是:将在代码中进行数据处理的操作转移到数据库中,比如某个查询需要对某张表中一年的数据进行统计,以
前是在代码中进行统计,现在改为在数据库中进行统计操作。这种方式暂时的解决了问题,可还是治标不治本,最后经过讨论,决定采取新的解
决方案二,即是建立中间表的方式。
方案二:
以前调用某个接口进行查询时,不管是原始方式还是第一种解决方案都会查询大量的数据,然后在对这些数据进行分组统计计算或者是其他操作,
不管怎么改有一个事实改变不了那就是需要查询大量数据。采用方案二就可以避免这个问题,中间表大致上是这样建立的,里面保存的数据信息
是原始表按照月份进行统计的数据。比如原始表中某个业务一年的数据可能有一千万条,在进行统计查询的时候,就需要查询这一千万条数据,
现在建立新表后,将原始表中的数据按照月份统计然后插入到新表中,这时候在进行统计查询时,只需要查询十二条数据即可。查询的数据量极
大的降低,所以效率才得以极大的提升。
这种优化方式很简单却很实用,对于系统效率的提升是立竿见影的。特别是在项目中后期,数据量越来越多的时候可以考虑采用这种方案。以前
的一个项目中也使用过这种处理方式,那时的处理方式是直接在代码中修改中间表的数据信息,统计查询时直接查询中间表中的数据即可。这次中
间表的数据是由有生产数据库操作权限的同事帮忙临时拉取的数据,后期的话肯定会考虑使用定时器定期拉取数据到中间表中。我们在业务中修改
查询语句和业务逻辑后,在没有出现类似的问题,到此问题解决。