如果您不了解ALTER TABLE的语法,可以先参考:

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

使用ALTER TABLE 可以修改一张表的结构。比如,添加或者删除一个字段,创建或者删除一个索引,修改一个字段的类型,或者重命名一个字段,或者表的一些元信息。我们还可以通过ALTER TABLE来修改表引擎。

在大多数情况下,ALTER TABLE通过建立一个原表的拷贝,并在拷贝上修改,然后删除原表,最后修改拷贝的名称为原表名来实现。在执行ALTER TABLE的时候是不能更新(update or insert)数据的, 但是其他的session是可以read的。

下面来具体看看如何最快的执行ALTER TABLE(这儿不考虑 分区/MySQL Cluster/表空间)

在某些特定的情况下,ALTER TABLE 是不需要建立临时拷贝的,所以是很快的。

1. 重命名一个字段或者索引

2. 修改一个字段的默认值

3. 添加新的枚举值到enum的末尾 或者 添加新的set值到set的末尾

4. 仅仅重命名表,而不修改其余任何参数

其他的情况,MySQL会建立一个临时表来执行ALTER TABLE。

对于MyISAM表,增大如下的变量可以加快ALTER TABLE的执行过程。

1. myisam_sort_buffer_size MySQL会在REPAIR TABLE索引排序或者使用ALTER TABLE/CREATE INDEX创建索引的时候申请缓冲的大小。

2. myisam_max_sort_file_size MySQL在使用REPAIR TABLE/ALTER TABLE/LOAD DATA重建MyISAM索引的时候允许申请的最大临时文件的大小,如果超过这个大小,MySQL将会使用很慢的key cache。

对于MyISAM表,还可以通过批量的建立索引来加快整个ALTER TABLE执行过程。通过在ALTER TABLE之前 运行 ALTER TABLE ... DISABLE KEYS/在ALTER TABLE之后运行ALTER TABLE ... ENABLE KEY来激活这个特性。但是个该特性对于主键和唯一索引不起作用。

在数据量比较大的时候,采用dump data/drop table/recreate table/load data的方式来修改表结构,会比ALTER TABLE快很多,当然这要看具体的应用,因为ALTER TABLE的过程中,可以提供继续read, 而采用dump data的方式则不行。

根据

http://everythingmysql.ning.com/profiles/blogs/whats-faster-than-alter

上的测试结果,80W条记录,约5G的数据量,采用dump data可以比ALTER TABLE直接修改快47%.

采用dump data的方式基本步骤如下:

1. 使用 select * from tablename into outfile "/tmp/data"; 保存数据到临时文件 /tmp/data

2. drop table tablename;

3. create table tablename (...);

4. 如果是 MyISAM, alter table tablename disable keys;

5. load data infile "/tmp/data" into tablename;

6. 如果是 MyISAM, alter tabe tablename enable keys;

最后,需要特别说明一下,有些时候,不一定需要最快,但应该选择最适合、最可靠的方式。

参考:

1. http://venublog.com/2010/01/04/performance-comparison-of-repair-by-sorting-or-by-keycache/

2. http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

3. http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html

4. http://everythingmysql.ning.com/xn/detail/3993569%3ABlogPost%3A171

如何最快地实现 ALTER TABLE的更多相关文章

  1. 翻译:MariaDB ALTER TABLE语句

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. alter table导致的mysql事务回滚失败

    今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败. 1.MySQL最常用的两个表类型: InnoDB和MyISAM.MyI ...

  3. ALTER TABLE - 修改表的定义

    SYNOPSIS ALTER TABLE [ ONLY ] name [ * ] ADD [ COLUMN ] column type [ column_constraint [ ... ] ] AL ...

  4. My Sql 中要Alter Table的同学请注意!!!

    首先我建议你在对MySQL表做DDL操作时: 1 执行 show processlist 查看,要操作的表(数据库对象)是否处于锁状态 if("未锁定") { 执行DDL语句 }e ...

  5. mySql中alter table的使用

    1.修改表名:alter table 原表名 rename to 新表名; 2.新增列:alter table 表名 add column 列名 varchar(20) ; 3.删除列:alter t ...

  6. sql语句-ALTER TABLE

    在工作中常遇到要维护数据库表的列,这里主要介绍sql语句中的ALTER TABLE 语句.ALTER TABLE 语句用于在已有的表中添加.修改或删除列. 如需在表中添加列,请使用下列语法: ALTE ...

  7. mysql ERROR 1062: ALTER TABLE causes auto_increment resequen

    当我用Navicat尝试修改已有记录的mysql数据表的主键为自动增长时,报出以下错误 1602 ALTER TABLE causes auto_increment resequencing, res ...

  8. MSSql Server 索引'uq_f_userName' 依赖于 列'f_userName'。由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN f_userName 失败

    --需求有变,需要往t_login表的f_userName字段添加外国人名,之前设置的varchar(10)不够,商议决定改成varchar(30),执行的时候,提示消息 索引'uq_f_userNa ...

  9. 【SQL篇章】【SQL语句梳理 :--基于MySQL5.6】【已梳理:ALTER TABLE解析】

    ALTER TABLE 解析实例: SQL: 1.增加列 2.增加列,调整列顺序 3.增加索引 4.增加约束 5.增加全文索引FULL-TEXT 6.改变列的默认值 7.改变列名字(类型,顺序) 8. ...

随机推荐

  1. Ubunut18.04与Windows传输文件的方式

    ubunut18.04与Windows传输文件的方式 开发环境:ubuntu18.04; 虚拟机:virtual box; 操作系统:Win10_64bits/专业版 在以前使用的ubuntu12.0 ...

  2. latex03-LaTeX中的中文处理办法

    编译含中文的tex文件的前提有三个: 默认编译器为XeLaTeX: 编辑器的默认字体编码格式为UTF-8: 引入ctex的宏包. 效果: 源码: %导言区 \documentclass{article ...

  3. Hbase数据IO

    场景及方案分析 场景1:logs --> HBase logs -> flume -> hfile -> import -> HBase (实时) csv导入HBase ...

  4. Android开发——View绘制过程源码解析(二)

    0. 前言   View的绘制流程从ViewRoot的performTraversals开始,经过measure,layout,draw三个流程,之后就可以在屏幕上看到View了.上一篇已经介绍了Vi ...

  5. 【C#】 语法糖

    [C#] 语法糖 一, 扩展方法 1. 对某个类功能上的扩展 2. 特点: 使用方便,可以在不修改原代码的基础上进行扩展. 参照 linq,linq 就是一系列的扩展方法 3. 语法: 非泛型静态类, ...

  6. [转]Android UI 自动化测试

    介绍 Android测试支持库包含UI自动化模块,它可以对Android应用进行自动黑盒测试.在API Level 18中引入了自动化模块,它允许开发者在组成应用UI的控件上模仿用户行为. 在这个教程 ...

  7. 深挖 NGUI 基础 之UIRoot (一)

    当你开始使用NGUI的时候,简单的从项目视图 中一个”Control”预设体 拖拽到场景视图中,你将会发现 Hierarchy层次面板中会出现以下层次结构: 其中 UI Root作为根节点,是每个NG ...

  8. Ajax请求被缓存的几种处理方式

    Ajax请求被缓存的几种处理方式 我们都知道IE会针对ajax请求的地址缓存请求结果,直到缓存过期之前,针对相同地址发出的请求,只有第一次会请求会真正发送到服务端.在某种情况下,这种缓存机制确实能提高 ...

  9. CSS实现自适应下保持宽高比

    在项目中,我们可能经常使得自己设计的网页能自适应.特别是网站中的图片,经常要求在网页放大(或缩小)时,宽高同时放大(或缩小),而且不变形(即保持正常的长宽比).为了不变形,常用的方法就是设置width ...

  10. CVPR2018: Generative Image Inpainting with Contextual Attention 论文翻译、解读

    注:博主是大四学生,翻译水平可能比不上研究人员的水平,博主会尽自己的力量为大家翻译这篇论文.翻译结果仅供参考,提供思路,翻译不足的地方博主会标注出来,请大家参照原文,请大家多多关照. 转载请务必注明出 ...