mysql 版本:5.6.21
mysql> show create table t_tag;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_tag | CREATE TABLE `t_tag` (
`tag_name` varchar(40) DEFAULT NULL,
`tag_desc` varchar(40) DEFAULT NULL,
`c` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table t_tag add index hlb(tag_name);
Query OK, 0 rows affected (12.77 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table t_tag add index hlb1(tag_desc),ALGORITHM=copy;
Query OK, 1097726 rows affected (49.93 sec)
Records: 1097726 Duplicates: 0 Warnings: 0
从上面看,tag_name 、tag_desc 两个字段类型一样,但是两者的消耗的时间却又很大的差别,
第一种方法叫 inplace ,就地更改,不影响行数据 (Query OK, 0 rows affected (12.77 sec))
第二种方法需要创建一个临时表,表中所有记录行受影响 (Query OK, 1097726 rows affected (49.93 sec))
同时当你对一个大表进行ddl 操作时,可以通过以下方法判断ddl 操作的一个大致情况
1、克隆原表的表结构
2、用原表的一小部分数据填充克隆表
3、在克隆表上执行ddl 操作
4、检查rows affected是0还是非0.如果是非0,意味着该DDL操作将要重建表中所有行数据,也就意味着你须要安排计划一个业务低峰值的时间或者在slave上操作。