Mysql大表修改字段

背景

由于平台币需要从之前的整形类型变为支持小数的decimal类型,所以需要对订单表的字段类型进行修改.

订单表: 目前数据已经有 2000多万数据了,数据量还是比较大的, 需要修改的字段有3个,订单表名为 order_info

解决方案一

直接用sql原生语句

alter table order_info MODIFY column coin_count decimal(6, 1);

耗时 500多秒都没执行完, 撤回了,因为锁表用户下不了单影响可能还是比较大的,所以该方案废弃了

解决方案二

用新旧表逻辑进行处理,主要步骤有以下几步

1: 创建新的表,名字为 order_info_new, 结构从 order_info 复制, 但是那三个字段已经从int改为decimal了, 这个步骤是不会锁表的

2: 把原有的order_info表名改为 order_info_old, 同时把order_info_new改为 order_info即可,这个步骤也很快,同时也不会锁表

3: 使用mysql自带的命令行语句把之前的数据迁移到新表中,语句如下,只需要等待完成即可:

INSERT INTO order_info SELECT * FROM order_info_old

注: 第1步建立表时需要注解id的问题,如果是自增的话那么新表的自增id要大一些,防止切换过程中id发生冲突问题

第三步执行时mysql默认是开启事务的,所以执行过程数据会查询不到,需要等到执行完成,看有没有这方面需要考虑的问题

选择

最终自然是使用了第二种方案咯,整个过程也不算太慢,2000多万数据迁移也就用了半个多小时,阿里的RDS感觉还是有点东西的应该

其他优化

在处理这个问题时,同时一并处理了订单表设计不合理的地方,主要处理了两个问题

1: 数据字段类型不合理设计

2: 历史数据进行部分迁移

类型优化

`delivery_status` int DEFAULT '1' COMMENT '发货状态 1:未发货 2:已发货' 订单表存在很多这种不合适的字段类型,不合理是因为这个字段只会有2个值,所以应该改为

`delivery_status` tinyint DEFAULT '1' COMMENT '发货状态 1:未发货 2:已发货',这样比较合理

改完效果还是比较明显的,一条数据就可以节省3个字节,2000多万条大概节省了12G空间出来,这是一件很有意义的事来的

历史数据迁移

order_info的数据从 2020年一直到2024年的数据都是在同一张表,但其实很多历史数据也不会查了,所以把2020-2021年的数据迁移到新的表中去了,做法也很简单

1: 原来的 order_info 只保留了 2022年以后至今的数据

2: 再创建一张 order_info_history 数据表,结构一摸一样的

3: 把 order_info 2022年前的数据全部转到 order_info_history 中

具体的操作命令如下:

INSERT INTO order_info SELECT * FROM order_info_old where create_time >= 1640966400000;

INSERT INTO order_info_history SELECT * FROM order_info_old where create_time < 1640966400000;

相关推荐
cypking23 分钟前
mysql 安装
数据库·mysql·adb
一个数据大开发41 分钟前
解读《数据资产质量评估实施规则》:企业数据资产认证落地的关键指南
大数据·数据库·人工智能
鬼面瓷1 小时前
CAPL编程_03
前端·数据库·笔记
南客先生2 小时前
MySQL索引优化、SQL分析与运行原理 - Java架构师面试实战
mysql·mvc·锁机制·sql分析·事务隔离级别·索引优化
欧先生^_^2 小时前
Jinja 的详细介绍和学习方法
数据库·sqlite
husterlichf2 小时前
MYSQL 常用字符串函数 和 时间函数详解
数据库·sql·mysql
hnlucky2 小时前
redis 数据类型新手练习系列——Hash类型
数据库·redis·学习·哈希算法
LucianaiB3 小时前
【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来
运维·数据库·人工智能·金仓数据库 2025 征文·数据库平替用金仓
时序数据说3 小时前
时序数据库IoTDB在航空航天领域的解决方案
大数据·数据库·时序数据库·iotdb
.生产的驴4 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven