需求:历史项目,随着项目的运行2年多,单表数据越来越大,越来越影响性能。
分析:数据是有热点的,近3个月的数据查询频率较高,时间越久查询的越少。进行分表操作,然后再调整下代码查询逻辑。
说明:ShardingSphere或者Mysql的分区方法也可以解决,但是目前的框架里没有使用shardingsphere,直接引用可能会导致一些其他问题,比如inser into select不能用。
Mysql的PARTITION的需要新建表然后做迁移。所以为了简单处理就用此方法拆分下。
原逻辑:查询->表名
现逻辑:查询->时间->返回备份的表名->查询对应的备份表
LOG_ID | 主键 |
TABLE_NAME | 主表名称 |
COL_NAME | 列名:依据此列进行划分备份 |
COL_FMT | 日期格式:例如yyyyMMddHHmmss | yyyyMMdd |
BACK_PRE_DAYS | 备份预备天数:即距离当前日期几天的需要备份 |
WEIGHT | 权值:用途是确定备份排序,每次从小的开始并累计加1,避免每天一直再处理同一个表数据,雨露均沾。 |
说明:启动一个定时任务,仅在指定时间范围内去备份,现有是01:30-05:00,即凌晨1点30分开始操作,如在05点未执行完也停止,防止对正常业务产生影响。总体策略:小步慢跑。
备份配置表数据样例:
依据规则备份的对应记录表:
手工核验数据是否备份有误,最后再手动删除下已备份的数据。
后续手动核对没有问题,再启动一个定时任务处理超期的已备份数据。
代码质量有限,就不全贴了,如有需要代码的可留言发送。