Mysql大表修改字段两种解决方式

 更新时间:2024年11月21日 09:21:19   作者:zxc_user  
这篇文章主要给大家介绍了关于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;

总结

到此这篇关于Mysql大表修改字段两种解决方式的文章就介绍到这了,更多相关Mysql大表修改字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL slow_log表无法修改成innodb引擎详解

    MySQL slow_log表无法修改成innodb引擎详解

    这篇文章主要给大家介绍了关于MySQL slow_log表无法修改成innodb引擎的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • MySQL提升大量数据查询效率的优化神器

    MySQL提升大量数据查询效率的优化神器

    这篇文章主要介绍了MySQL提升大量数据查询效率的优化神器,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 解决Idea链接mysql数据库失败Schemas中为空的问题

    解决Idea链接mysql数据库失败Schemas中为空的问题

    文章讲述了在使用Sechemas拦截MySQL数据库时遇到没有数据的情况,并分析了可能是由于数据库版本问题导致的,作者建议根据自己的数据库版本进行选择,如果不确定版本,可以尝试所有版本,以解决问题
    2026-01-01
  • mysql 分页优化解析

    mysql 分页优化解析

    似乎讨论分页的人很少,难道大家都沉迷于limit m,n?在有索引的情况下,limit m,n速度足够,可是在复杂条件搜索时,where somthing order by somefield+somefieldmysql会搜遍数据库,找出“所有”符合条件的记录,然后取出m,n条记录。
    2008-04-04
  • MySQL主从架构原理、优化与实践指南全解析

    MySQL主从架构原理、优化与实践指南全解析

    这是一份关于MySQL主从架构的深度解析指南,本文将从核心原理出发,延伸至架构优化、延迟排查及高可用切换等实践层面,帮助您构建一个稳定、高效的 MySQL 数据同步体系
    2026-04-04
  • MySQL之Explain详解

    MySQL之Explain详解

    使用Explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈,感兴趣的的同学可以参考阅读
    2023-04-04
  • 解决MySql不等于的条件过滤字段值为NULL问题

    解决MySql不等于的条件过滤字段值为NULL问题

    今天遇到一个查询结果不对的问题,使用isNull能解决问题,但因查询条件过滤null,还有不同的写法,总结了两种实现方式,希望能给大家一个参考
    2024-12-12
  • 前端传参数进行Mybatis调用mysql存储过程执行返回值详解

    前端传参数进行Mybatis调用mysql存储过程执行返回值详解

    这篇文章主要介绍了前端传参数进行Mybatis调用mysql存储过程执行返回值详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 关于MySQL的ORDER BY排序详解

    关于MySQL的ORDER BY排序详解

    这篇文章主要介绍了关于MySQL的ORDER BY排序详解,如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的,需要的朋友可以参考下
    2023-05-05
  • 详解mysql数据库如何开启慢查询日志

    详解mysql数据库如何开启慢查询日志

    这篇文章主要介绍了详解mysql数据库如何开启慢查询日志的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论