用户数量有几十万,每人每天有 20 多个参数要计算保存。这 20 个有一个是基本参数,其他的都是由这一个计算出来。
插入需求:
每天固定开始插入,希望在一个小时之内插入完成
查询需求:
扩展需求:
能满足到百万用户的需求
硬件需求: 8Core 的 CPU 8G 内存,普通 500G 硬盘的服务器做 DB。查询和计算有两台 4Core 8G 的可以使用
软件需求: 基本没有,只要稳定就行,mysql,nosql,MongoDB 都可以。
目前方案:
现在已经积累了几十亿 几十 G 的数据,在 mysql 中存储,仅按照每个参数来分的,每个表的规模都很了,上亿了。插入效率很低,查询也很慢,问题很多
这个问题的瓶颈应该是数据库写入和查询了 个人认为可以这么处理: 1 分表,分级别,需要及时插入的,如你说的 1 小时要插入完成的记录,放一个表,只记录一定时间的数据,这样插入查询都快。超过时间后移到另一张表,迁移过程可以在业务少的时候进行。如果数据量更大,就可以分不同访问级别放表,就可以区分进行优化,比如第一张插入多,那就 index 少点,第二张查询多,那就 index 多点,第三张基本上都不用,放历史数据,这样三级迁移,基本上能满足不同的需求
分布式数据库,现在很多数据库都支付,像 ruby-china 的 redis,Cassandra 什么的,都是支付分布式的 mysql postgresql 之类的现在也开始支持,差不多,就是数据分放,但由数据库本身支持,你不用多做什么 其实最容易解决 这种问题的办法,是增加设备 我以前做集成 的,我们解决 这类问题基本上都先从硬件开始,不到不得已,不动软件。因为买硬件钱算客户的,开发软件,工作量算自己的,但你给你们自己做,可能思考的立场不太一样。
但增加硬件确实是行之有效的办法
#9 楼 @songlipeng2003 如果这么说,那你们的架构需要调整,这个属于数据备份的概念,定时把历史数据 mv
到 mongodb/couchdb 中去
表设计不合理,第一条军规:经常访问的数据和不经常访问的数据需要分表甚至分库存储,第二条:读写分离,历史数据不应该和业务数据混在一起。你说的这点事在电信产品中很常见