【原创】关于表结构更改的大量数据的迁移方案

news2025/1/20 5:50:26

前言

由于公司要求做产品之间的对接,需要统一表结构和字段名,但是有些表有上亿条数据,如果直接修改表字段名和加字段每一条SQL都要执行大量时间,大概时间为加一个字段1.5小时/1亿条数据,这耗时实在太长了,而且有些表需要涉及6~8个字段更新,这么耗时显然是不行的。因此需要别的解决方案。

总体解决方案

第一步:先创建新表,新表包含了目前最新的表结构。

第二步:使用insert select方式从目前的表查询数据,然后insert到新表中,一切操作都在MYSQL内部执行,且insert完的数据就是修改完表结构的数据, 也就是说insert完一遍后表结构更改也就完成了。

第三步:将目前的表的表名改成别的,将新表改成原来的表名即可,修改表名是非常快的。

遇到的问题

1、insert select这个思路是对的,就是select太坑了,我去傻乎乎的直接去select没加limit,导致一下子查询了上亿条数据,导致服务器内存直接100%,MYSQL因为内存不够直接crash了!这下出大事了!赶紧让现场人员重启MYSQL,还好只是内存溢出导致的crash,数据本身没有受到影响。

大家千万别我犯一样的错啊!!

2、有些新增字段没有数据怎么办

问题解决方案

问题一:

使用MyBatis,先select count(0),统计出所有数据的量,然后通过for循环的方式去分页select,这样就能保证内存不溢出了。

问题二:

这个就很简单了,能够用mysql直接算出来的就用mysql直接算出来就行了,比如缺时间,那就用NOW()补充就完事了,有些新增列有默认值的就不管了,或者insert一个默认值进去,以后用到了再更新都行。

上代码

由于公司的代码必须严格保密,这里就是用最最最常用的学生表来举个栗子:

假设从表my_student(旧表)迁移数据到dct_student(新表),my_student表的结构为:

dct_student表的结构为:

 my_student表数据为:

 使用SQL:

insert into dct_student (
stu_id,
stu_name,
gender,
state,
birthday,
register_time,
father_name,
mother_name,
del,
create_time,
update_time)

select 
id,
name,
gender,
1,
birthday,
register_time,
NULL,
NULL,
del,
create_time,
NOW()
from my_student limit 0,500000;

 即可完成迁移。

注意!limit必须要加防止因为数据库内数据量过大,导致服务器内存不够,结果导致MYSQL崩溃。因此limit内的值不能过大,过大内存可能扛不住,过小则每次迁移的量实在太小,我个人测试下来50W条一次差不多。

那可能就有人要问了,如果数据量超过50W条怎么办,难道还得手动编辑分页不成?

那这就得交给Java程序了,首先先selectCount一下,算出一共多少条数据,然后按50W条进行分页,然后每页执行这个insert select即可。

大概的Mapper长这样:

@Mapper
public interface DctStudentMapper extends BaseMapper<DctStudentEntity> {
    @Select("insert into dct_student (\n" +
            "stu_id,\n" +
            "stu_name,\n" +
            "gender,\n" +
            "state,\n" +
            "birthday,\n" +
            "register_time,\n" +
            "father_name,\n" +
            "mother_name,\n" +
            "del,\n" +
            "create_time,\n" +
            "update_time)\n" +
            "\n" +
            "select \n" +
            "id,\n" +
            "name,\n" +
            "gender,\n" +
            "1,\n" +
            "birthday,\n" +
            "register_time,\n" +
            "NULL,\n" +
            "NULL,\n" +
            "del,\n" +
            "create_time,\n" +
            "NOW()\n" +
            "from my_student limit #{pageStart}, #{pageSize};")
    void pageInsertSelect(long pageStart,int pageSize);
}

统计完总数后一个for循环就搞定了,这我就不再赘述了,相信大家都会操作。

迁移完成的结果长这样:

时间统计

公司里的项目试过,1亿条数据,修改一个字段耗时大概90分钟,6个字段就要大概7小时。而这个insert select1亿条数据大概1小时多点就能完成,比修改字段快太多。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub价值1w的Java最新面试宝典(附答案解析)被我弄到手了

为了能够帮助更多Java岗位同学就业&#xff0c;小编淘来了GitHub上最新Java面试宝典&#xff0c;本套题库均来自海量真实校招面试题目大数据进行的整理&#xff0c;学完这个题库&#xff0c;把此题库都理解透彻应对各家企业面试完全没有问题。&#xff08;当然要加上好的项目以…

Hosmer-Lemeshow检验(HL检验)

Hosmer-Lemeshow检验&#xff08;HL检验&#xff09;为模型拟合指标&#xff0c;其原理在于判断预测值与真实值之间的gap情况&#xff0c;如果p值大于0.05&#xff0c;则说明通过HL检验&#xff0c;即说明预测值与真实值之间并无非常明显的差异。反之如果p值小于0.05&#xff0…

操作系统:处理机调度与死锁 练习题(带有解析和答案)

文章目录1.处理机调度的层次和调度算法的目标1.1.处理机调度的层次1.2.处理机调度算法的目标求解周转时间和带权周转时间例题2.作业与作业调度2.1.批处理系统中的作业2.2.作业调度的主要任务2.3.先来先服务和短作业优先调度算法2.4.优先级调度算法和高响应比调度算法3.进程调度…

基于ASPNET+SQL的医院在线预约平台系统的设计与开发

本论文介绍的主要内容是从武警警官医院在线预约平台系统的需求分析到详细设计,最后到测试部分的整个过程。其实现主要功能有患者信息、医务人员、科室信息的管理和在线咨询、在线预约信息管理等五个主要模块。系统实现了用户信息在线管理、浏览以及在线咨询与预约信息的交互和数…

Node2vec

引言 这篇论文可以说是对DeepWalk的扩展&#xff0c;按照LINE的说法&#xff0c;DeepWalk只捕捉了节点间的二阶相似性。LINE同时捕捉节点间的一阶相似性和二阶相似性。而Node2Vec同时也是同时捕捉一阶相似性和二阶相似性。和LINE不同的是&#xff0c;Node2Vec是基于Random Wal…

SpringCloudGateWay个人笔记

核心概念&#xff1a; Route&#xff08;路由&#xff09;&#xff1a; 路由是构建⽹关的基本模块&#xff0c;它由ID&#xff0c;⽬标URI&#xff0c;⼀系列的断⾔和过滤器组成&#xff0c;如果断⾔为true就 匹配该路由。Predicate&#xff08;断⾔、谓词&#xff09;&#xf…

D-018 LED硬件电路设计

LED硬件电路设计1 简介2 LED的参数3 驱动方式3.1 定电压驱动3.2 定电流驱动4 应用场景5 设计要点1 简介 发光二极管&#xff08;简称LED&#xff09;,是一种发光的电子器件&#xff0c;能将电能转换为光能。这种器件不仅发光效率高&#xff0c;而且节能、寿命长。LED会议波长来…

SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)

代码资源位置&#xff1a;F:\workspace\SpringMVC代码\springMVC-demo4 1、RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c;即&#xff0c;将服务器看作是由很多离散的资源组…

C语言 指针与数组

C语言 指针与数组引言1. 指针与数组之间的联系2. 指针与字符串之间的联系一、指针与数组1. 对比两者的区别2. 指针数组的用法3. 数组指针的用法二、数组参数、指针参数1. 一维数组传参2. 二维数组传参三、指针与函数 (了解)1. 其实函数也有地址2. 函数指针3. 函数指针数组4. qs…

03_SpringBoot项目配置

文章目录SpringBoot项目配置0x01_properties格式配置文件0x02_yml格式配置文件配置对象类型数据配置集合类型配置数组类型0x03_properties和yml的区别优先级区别0x04_配置文件在项目中的位置0x05_bootstrap配置文件0x06_springboot项目结构SpringBoot项目配置 SpringBoot默认读…

Mysql数据库和SQL语句

一、数据库介绍&安装 1. 什么数据库软件 在前期学习的过程中&#xff0c;对于数据的保存方式有两种体现&#xff1a; 一种是将数据保存到本地的文件中&#xff0c;优点是可以持久保存&#xff0c;但是数据管理查询等相当麻烦。 一种是将数据保存到本地的内存中&#xff0c…

Linux学习记录——삼 基本指令(3)及了解权限

接着上一篇把一些基本命令写完 unzip解压默认解压到当前目录&#xff0c;加上-d后面跟路径就可以解压到指定目的地 tar指令 不同文件格式的压缩指令&#xff0c;可以直接看内容&#xff0c;不需要打开。tar后面有几个指令选项。-c表示创建压缩文件&#xff0c;-z打包并压缩&am…

E. Matrix and Shifts(思维+遍历正对角线)

Problem - 1660E - Codeforces 你会得到一个大小为nn的二进制矩阵A。行从上到下从1到n编号&#xff0c;列从左到右从1到n编号&#xff0c;位于第i行和第j列交点的元素称为Aij。考虑一组4个操作。 循环地将所有行向上移动。索引为i的行将被写在i-1行的位置上&#xff08;2≤i≤…

文件权限概念,相关操作

一&#xff0c;文件权限的基本概念 权限&#xff1a;操作系统限制对资源访问的一种机制。 文件权限的信息展示&#xff0c;使用ls -l 命令即可查看&#xff1a; 整个文件信息可以分为以下几部分&#xff1a; &#xff08;一&#xff09;第一个字段表示文件类型 和 文件权限。…

Socket套接字编程

文章目录1、网络字节序列2、socket编程接口<1>socket常见ARI<2>sockaddr结构 VS sockaddr_in结构3、UDP套接字4、TCP套接字5、总结1、网络字节序列 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏 移地址也有大端小端…

腾讯T9纯手写基于Mycat中间件的分布式数据库架构笔记

随着移动互联网的兴起和大数据的蓬勃发展&#xff0c;系统的数据量正呈几何倍数增长&#xff0c;系统的压力也越来越大&#xff0c;这时最容易出现的问题就是服务器繁忙&#xff0c;我们可以通过增加服务器及改造系统来缓解压力&#xff0c;然后采用负载均衡、动静分离、缓存系…

流媒体传输 - RTSP Over HTTP

RTSP 的标准端口是 554&#xff0c;但是由于各种不同的防火墙等安全策略配置的原因&#xff0c;客户端在访问 554 端口时可能存在限制&#xff0c;从而无法正常传输 RTSP 报文。 但是 HTTP 端口&#xff08;80 端口&#xff09;是普遍开放的&#xff0c;于是就有了让 RTSP 报文…

【Android App】给三维的地球仪贴上动物贴纸实战(附源码和演示 超详细必看)

需要源码和图片集请点赞关注收藏后评论区留言~~~ 一、纹理贴图 给三维物体穿衣服的动作&#xff0c;通常叫做给三维图形贴图&#xff0c;更专业地说叫纹理渲染。 渲染纹理的过程主要由三大项操作组成&#xff0c;分别说明如下&#xff1a; &#xff08;1&#xff09;启用纹理…

STL的常用遍历算法(20221128)

STL的常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric> 组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;涉及比较、交换、查找、遍历等等&#xff1b; <functional>定义了一些模板类&#xff0…

2022VR高级研修班总结

本人有幸参加2022VR高级研修班&#xff0c;此次高级研修班由赵沁平院士和丁文华院士领衔&#xff0c;全国知名专家及长期在相关领域从事产业、管理、科研工作的专家参与&#xff0c;带来了18个专题讲座&#xff0c;内容涵盖虚拟现实技术与系统现状与发展、产学研合作与产业协同…