# mysql为大表增加字段 {#mysql为大表增加字段}
本文讲述如何为mysql的一张大表快速地增加字段。默认情况下,若对mysql的一张数据量很大的表新增字段时, 会巨慢无比, 执行一个新增字段的语句可能要执行七八个小时,甚至更久,这简直无法接受。那么本文就来总结下为mysql的大表快速增加字段的若干方法。
# 1. 使用mysql自带的优化方法 {#_1-使用mysql自带的优化方法}
只需在原有的sql语句基础上补充个参数(用来指定具体算法)即可,不同的mysql版本支持不同的算法,详情可以访问mysql大型表的DDL操作 (opens new window)。
# 5.7版本 {#_5-7版本}
如下是在一个真实的线上环境的执行过程。 为了提高执行效率,我已经把数据库写操作的程序暂时停掉了。
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.22-log |
+------------+
1 row in set (0.03 sec)
mysql> select count(1) from news;
+----------+
| count(1) |
+----------+
| 863780 |
+----------+
1 row in set (0.22 sec)
mysql> alter table news add column (
-> site_type int(1) default 1 comment '站点类型, 对应site表的type字段',
-> img_count int default 0 comment '图片数量',
-> nsfw float default 0 comment '鉴黄值: 数值0-1之间,值越大,色情度越高'
-> ), ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (11 min 0.59 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select count(1) from news_img;
+----------+
| count(1) |
+----------+
| 4476600 |
+----------+
1 row in set (0.87 sec)
mysql> alter table news_img add column (
-> site_type int(1) default 1 comment '站点类型, 对应site表的type字段',
-> width int default 0 comment '宽',
-> height int default 0 comment '高'
-> ), ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (8 min 24.88 sec)
Records: 0 Duplicates: 0 Warnings: 0
可以看出,对1张86万条数据的表的修改耗时约11分钟,对1张447万条数据的表的修改耗时约8分钟。