背景
有且只有一台 db 服务器提供服务,该服务器同时支撑业务和统计需要。
统计的表单需要导出成 excel,且后续不能确定该表单是否还会修改。
导出数据的同时,需要为数据写入导出标识。
导出的数据总条数未做限制(有,但是范围比较大).
目前主要是导出结算单和申述单的支付统计。
数据库设计
针对上述背景,为了防止在执行导出操作时候造成对在线运行业务的影响,采用了mysql + mongodb 的方案,导出时候的查库和写库操作都在 mongodb 中执行。
数据库设计如下:
1、MySQL中存储的是业务数据。
因为统计查询涉及到多张表,所以这里将使用到的各个表的字段做成了视图。
视图建表语句为
CREATE OR REPLACE VIEW view_name AS
SELECT fields FROM table1, table2 where condition.
2、mongodb 中是统计使用的数据。每个数据有两个附属字段记录上次数据的同步时间last_sync_time 以及该条数据的最近变更时间last_update_time。
当统计程序修改 mongodb 中的数据同时,修改数据的最近变更时间。
3、运行数据同步脚本的时候,首先将 last_sync_time 不等于 last_update_time 的数据回写入 mysql 数据库(写入对象是视图);然后将 MySQL 中,创建时间大于 last_sync_time 的数据同步到 mongo 中(因为 mongo 中的数据是累加的,所以这里的 last_sync_time 取最近的一次即可)。
程序统计
1、为了快速更新 mysql 中的数据,使用
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE cc=c+1;
提高批量更新数据的效率。
2、使用 PHPExcel 生成 Excel 文件。