MySQL中大数据表增加字段的实现思路

前言

增加字段相信大家应该都不陌生,随手就可以写出来,给 MySQL 一张表加字段执行如下 sql 就可以了:

ALTER TABLE tbl_tpl ADD title(255) DEFAULT '' COMMENT '标题' AFTER id;

但是线上的一张表如果数据量很大呢,执行加字段操作就会锁表,这个过程可能需要很长时间甚至导致服务崩溃,那么这样操作就很有风险了。

那么,给 MySQL 大表加字段的思路如下:

① 创建一个临时的新表,首先复制旧表的结构(包含索引)

create table new_table like old_table;

② 给新表加上新增的字段

③ 把旧表的数据复制过来

insert into new_table(filed1,filed2…) select filed1,filed2,… from old_table

④ 删除旧表,重命名新表的名字为旧表的名字

不过这里需要注意,执行第三步的时候,可能这个过程也需要时间,这个时候有新的数据进来,所以原来的表如果有字段记录了数据的写入时间就最好了,可以找到执行这一步操作之后的数据,并重复导入到新表,直到数据差异很小。不过还是会可能损失极少量的数据。

所以,如果表的数据特别大,同时又要保证数据完整,最好停机操作。

另外的方法:

1.在从库进行加字段操作,然后主从切换

2.使用第三方在线改字段的工具

一般情况下,十几万的数据量,可以直接进行加字段操作。

总结

以上就是关于在MySQL大表中加字段的实现思路,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

时间: 2024-09-22 14:16:33

MySQL中大数据表增加字段的实现思路的相关文章

php mysql显示数据表字段 SHOW FIELDS

php mysql显示数据表字段 SHOW FIELDS $mydbname=RepPostVar($_GET['mydbname']); $mytbname=RepPostVar($_GET['mytbname']); if(empty($mydbname)||empty($mytbname)) {  printerror("ErrorUrl","history.go(-1)"); } $form=$_GET['form']; if(empty($form)) {

表设计-mysql关于数据表的设计

问题描述 mysql关于数据表的设计 我现在有一个member(用户表)里面存放了一个用户的所有信息.还有一个hobby(爱好表)里面存放所有的爱好.现在我需要给用户存放hobby表里面的爱好.我是应该直接在member表里面加一个hobby字段,然后存放爱好表里面的ID如(123),还是应该再一个表来存放用户跟爱好的关系呢?或者还有没有其它更好的可能,**注意:一个用户可以有多个爱好,而以后我只需要查询某一个爱好的人有那些.** 解决方案 这个还是要根据你的需要来定, 如果说以后都是以用户来查

hibernate-数据库表增加字段后如何在获取历史数据时添加默认值?

问题描述 数据库表增加字段后如何在获取历史数据时添加默认值? 表增加了一个字段,定义是基本类型有默认值,新生成的数据没问题但是历史数据该字段都是空值,导致程序会出错,JavaBean中的字段类型double和数据库中的空值不匹配,本来想在get和set中做点文章,返回一个默认值,但是用hibernate的detachedCriteria查询返回的list直接就报null的错误,set方法都没执行,不知道是什么原理为什么set方法都没执行,是不是在set传入变量的时候就发现空值然后就报错了?另外有

mysql update 根据表中字段查询另一张表更新更新

问题描述 mysql update 根据表中字段查询另一张表更新更新 mysql有两张表, 班级表class,包含 | id | name | | 1 | 一班 | | 2 | 二班 | 学生表student,其中classId为空,className有值并对应class表中的name | id | name | classId | className | | 1 | 一班 | | 一班 | | 2 | 二班 | | 二班 | | 3 | 一班 | | 一班 | | 4 | 二班 | | 二班

MySQL清空数据表的方法实例与分析_Mysql

MySQL数据库中,如果我们想清空数据表(删除数据表中所有内容)的话,可以通过下面两个语句来实现: truncate table table_n; delete from table_n; 实例 我们先通过实例看下通过这两种方式清空数据库的过程和结果 #delete演示 mysql> create table testforde( -> number int not null auto_increment, -> name varchar(20) not null, -> prim

oracle 11g中大数据表的增量备份和增量加载

问题描述 oracle 11g中大数据表的增量备份和增量加载 由于数据库中表的记录非常多,都在1000W条以上,数据量又大,一张表最大达几十个G,每次全部备份和加载非常花时间,现在想考虑一段时间备份加载一下,通过增量的方式,请问该如何实现呢? 解决方案 半年或1年完全备份一次完整版的 不然增量备份3年 恢复数据库你就知道有多痛苦了增量备份不会

跪求一sql语句:查询sql数据表的字段的备注内容

问题描述 是这样的,想做一个对应表字段的查询联合查询,因为数据表的字段名是英文的,但备注是汉字的,所以想根据备注查出对应表的字段名,然后在按这个字段进行查询.首先:第一步查出表说所有字段的备注2:然后根据备注内容查询出字段名:我是菜鸟,请大家帮下忙!! 解决方案 解决方案二:selectcommentsfromuser_col_commentswheretable_name='TEST'andcolumn_name='NAME';解决方案三:declare@atable(字段名nvarchar(

如何使用规则来限制数据表中字段的有限范围

问题描述 问题是:如何使用规则来限制数据表中字段的有限范围 解决方案 解决方案二:使用rule或者CHECK约束都可以达到你要的效果!建议在数据库层实施!如果是在界面层,建议定义属性检查.解决方案三:能不能详细的介绍一下啊,我不太清楚唉,谢谢解决方案四:CHECK约束列可以有任意多个CHECK约束,并且约束条件中可以包含用AND和OR组合起来的多个逻辑表达式.列上的多个CHECK约束按创建顺序进行验证.搜索条件必须取值为布尔表达式,并且不能引用其它表.列级CHECK约束只能引用被约束的列,表级C

方便查看数据表和字段的SQL语句(适用于SQLServer2000)

经过对SQLServer2000系统表的分析,写出了以下两个SQL语句.可以把这两个语句分别建为两个"视图",方便查看用户数据表和字段的信息. 1.列出所有的用户数据表: SELECT TOP 100 PERCENT o.name AS 表名FROM dbo.syscolumns c INNER JOIN      dbo.sysobjects o ON o.id = c.id AND objectproperty(o.id, N'IsUserTable') = 1 AND