项目是公司的业务OA系统,记录公司业务的所有数据,目前mysql表总大小在6G,最大表行数在6百万行。平均100+人同时使用系统,人数还在增加中。
系统总体速度还行,但是速度一天天在下降,特别是高峰期的时候延时非常高。
主要原因还是数据统计的地方引起。统计数据须要实时统计,每个人每个页面展现数据都不一样,因为表比较多需要用到联合查询的地方非常多,数据量越来越大导致速度越来越慢。
因为需要实时数据,所以没有做缓存,而且每个展现的数据都不一样,每个页面有很多的不同条件统计数量,没有想到有什么好的办法解决这个问题,不知道有没有哪位大神给小弟出谋划策?
目前只有一台服务器,16核+64G,读写全部在同一个服务器,目前不打算增加服务器。
1 .利用定时任务统计数据到统计结果表,当然这样实时性不够好
2.数据放到ES/Solr等索引里面,可以大幅度提高查询性能
实时统计不需要实时的地方已经做过了,页面中实时显示的做不了定时任务。放es/solr比较麻烦,改动比较大,可能会影响业务运展。
可不可以这样,比如你统计人数,维护一个人数表,每次有人登录,就加1,这样比用select count 查询快。如果数据结构允许的话也可以把这个实时改变的统计数据放到redis里。
因为角色比较多,同一个数据不同类型可能会影响多个人的统计数据,所以每个动作都循环处理所有人的统计消耗有点大,而且数据变动比较频繁。
升级硬件是最便宜的方法,当然你把整个应用花几个月时间优化一下也可以,毕竟工资不算在成本里面。
统计数据须要实时统计,每个人每个页面展现数据都不一样,因为表比较多需要用到联合查询的地方非常多
这句话通常是错误的需求分析导致的,人是这样的,只要觉得这个没有成本,那当然越快越好,但实际上并不是每个人都需要买奔驰,也不是每个人都需要随时知道一分钟前刚刚有个顾客买走了三斤苹果。
是的,需求都是想到就做,没考虑后期数据量和人数的增加。导致问题越来越多,最好的办法就是重写优化了,但是时间不允许。项目一直在更新迭代,导致代码和数据的冗余越来越多,早期的代码越来越沉重。
实时统计的话,能用字段存统计结果的,用字段存,联合查询不要超过三张表,能不用关联就不用,查询了主表后,用in查附表,关联字段通常来说都会有索引,处理好表的索引,sql里减少数据的处理逻辑,尽量把计算逻辑放在代码层面计算
准备采用中间件+缓存的方式解决。