mysql的alter table操作的性能对于大表来说是个大问题。mysql大部分修改表结构操作的方法都是用新的结构创建一个

新表,从旧表中查出数据插入新表,然后在删除旧表。这样的操作很耗费时间,而且还有可能中断mysql服务。

这里推荐一种方法来提高alter table的操作速度。(请注意数据备份

修改数据表的.frm文件,步骤如下:

1、创建一个有相同结构的新表,并进行所需修改(例如增加ENUM常量值)。

2、执行FLUSH TABLES WITH READ LOCK.加锁禁止打开所有表。

3、交换新表和旧表的.frm文件。

4、执行UNLOCK TABLES解锁。

语句实例:修改列user_status

mysql> desc users;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| user_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| user_name | char(125) | NO | | NULL | |
| user_pass | char(32) | NO | | NULL | |
| user_status | enum('0','1') | NO | | NULL | |
| user_type | tinyint(2) unsigned | NO | MUL | 0 | |
+-------------+---------------------+------+-----+---------+----------------+
mysql>create table users_tmp like users;
mysql>alter table users_tmp modify column user_status enum ('0','1','2') default '2';
mysql>desc users_tmp;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| user_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| user_name | char(125) | NO | | NULL | |
| user_pass | char(32) | NO | | NULL | |
| user_status | enum('0','1','2') | YES | | 2 | |
| user_type | tinyint(2) unsigned | NO | MUL | 0 | |
+-------------+---------------------+------+-----+---------+----------------+
mysql>flush tables with read lock;
#-----------------------------------
这里是shell命令
进入mysql的datadir目录交换.frm文件
[root@localhost /var/lib/mysql/test/] cp -a users.frm users.frm.backup
[root@localhost /var/lib/mysql/test/] mv users_tmp.frm users.frm #这个会直接删除删除新建的表user_tmp
#-----------------------------------
mysql>unlock tables;
mysql>desc users;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| user_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| user_name | char(125) | NO | | NULL | |
| user_pass | char(32) | NO | | NULL | |
| user_status | enum('0','1','2') | YES | | 2 | |
| user_type | tinyint(2) unsigned | NO | MUL | 0 | |
+-------------+---------------------+------+-----+---------+----------------+

加快ALTER TABLE 操作速度的更多相关文章

  1. 加快alter table

    mysql的alter table操作的性能对打表来说是个大问题. mysql执行大部分修改表结构的方法是用新的结构创建一个空表,从旧表中查出所有的数据插入新表,然后删除旧表.这样操作就可能需要花费很 ...

  2. 如何最快地实现 ALTER TABLE

    如果您不了解ALTER TABLE的语法,可以先参考: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html 使用ALTER TABLE 可以 ...

  3. mysql 添加索引,ALTER TABLE和CREATE INDEX的区别

    nvicat-->mysql表设计-->创建索引. (1)使用ALTER TABLE语句创建索引,其中包括普通索引.UNIQUE索引和PRIMARY KEY索引3种创建索引的格式: PRI ...

  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. JIRA备份,数据迁移以及小问题

    Jira的备份(切记将许可证号备份) Jira默认会打开自动备份的功能,备份路径为/var/atlassian/application-data/jira/export 管理员账号登录Jira,点击右 ...

  2. Access denied for user 'ODBC'@'localhost' (using password: NO) 的解决方法

    在部署公司的web项目到myeclipse时遇到的一个错误:Access denied for user 'ODBC'@'localhost' (using password: NO),貌似是mysq ...

  3. (五)C语言之表达式

  4. word 之 插入删除空行

    好久没有写程序了.有些手生: 在用C#对word进行直接开发操作过程中,为了文档的美观,我们会插入或删除空行. 1.插入空行的代码很简单. Selection 类型的TypeParagraph()函数 ...

  5. Python dictionary 字典

    Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一.创建字典字典由键和对应值成对组成.字典也被称作关联数组或哈希表.基本语法如下: dict = {' ...

  6. tomcat8踩坑:url包含|等特殊字符报错400的问题

    这个问题纠缠了我很久了,终于在今天早上解决了,感谢自己的不放弃和不断尝试的决心,我坚信,我可以找到解决方式!! 项目用的spring boot+spring security框架,关于统一错误页面在开 ...

  7. 2.ibatis执行流程解析

    以下仅为个人理解,如有问题,欢迎指正

  8. Creator性能优化

    性能优化主要这几个方面进行优化:加载优化,渲染优化,内存优化,CPU优化及一些小技巧. 加载优化 图片资源处理:巧用九宫格拉伸来实现资源得复用,如大的纯色背景图,完全可以使用一张小图来进行拉伸获得: ...

  9. Linux安全加固之中间件Tomcat

    (注:皆为参考操作配置) 这次是tomcat的Linux加固,分为身份鉴别.访问控制.安全审计.资源控制和入侵防范5个方面大部分加固基于xml配置文件进行修改,也应根据实际需求制定方案.寻找配置文件目 ...

  10. Selenium 2自动化测试实战30(unittest补充)

    unittest补充 1.用例执行的顺序 #test.py #coding:utf-8 from Demo1 import Count import unittest class TestBdd(un ...