线上mysql大表数据迁移到备库
由于项目中线上有很多表(古老,未作分表)数据量比较大,页面接口查询时经常超时,已经在索引方面不能提高查询速度了,因此考虑将部分数据(半年之前)迁移到备份库中,备份的表结构和数据和原始表相同,这部分数据基本上已经不使用了,所以只做了数据迁移。
迁移方案:跑批处理
1.从原始表中查出需要备份的数据
返回一个List<map>
<select id="queryByxxx" resultType="java.util.HashMap">
select *
from ${tableName}
where ${tableColumnName} = #{tableColumnValue}
</select>
2.将数据插入到备份库表中
遍历上面查出来的List
<insert id="insertData" >
insert into
${tableName}
(
<foreach collection="data" item="value" index="key" separator=",">
${key}
</foreach>
)
values (
<foreach collection="data" item="value" index="key" separator=",">
#{value}
</foreach>
)
</insert>
其中的 collection="data" 中的data就是上面list中的元素
3.删除原始表中的数据
<delete id="deleteByxxx" >
delete from ${tableName} where ${tableColumnName} = #{tableColumnValue}
</delete>
上述只是简单的实现流程,其中涉及多数据源配置,也要从本身业务逻辑做异常处理,比如异常中断可继续备份。使用线程池多线程并且可以根据时间段分段处理历史数据,加快处理速度。
本文介绍如何通过批处理方式,从线上未分表的大表中迁移半年前的历史数据到备份库,以提升查询性能。涉及数据筛选、多数据源操作、异常处理和线程并行处理,以加速历史数据备份过程。
7363

被折叠的 条评论
为什么被折叠?



