MySQL的表现ALTER TABLE在列之后添加列 - 在一张大桌子上

Dre*_*rew 28 mysql

我想实现以下使用以下命令将列添加到现有表:

   ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;
Run Code Online (Sandbox Code Playgroud)

没有AFTER COLUMN选项,此选项是否比相同的命令长得多,如下所示?

   ALTER TABLE foo ADD COLUMN bar;
Run Code Online (Sandbox Code Playgroud)

第一个命令会在执行期间使用更大量的tmp表空间来执行操作吗?

上下文:我有一个非常大的表(想想超过十亿行),我想使用AFTER COLUMN选项添加一个额外的列,但我不想受到太多惩罚.

Boo*_*eus 35

这就是我要做的事情:

CREATE TABLE newtable LIKE oldtable;
ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NOT NULL DEFAULT 0; 
Run Code Online (Sandbox Code Playgroud)

我不知道你的专栏的类型.我举一个INT的例子.现在,您可以在此处指定要添加此新列的位置.默认情况下,除非您指定AFTER关键字,否则它会在最后添加它,如果您提供它,则必须按顺序指定,否则您需要将其放在最后.

INSERT INTO newtable SELECT field1, field2, field3 /*etc...*/, newcolumn = 0 FROM oldtable; 
Run Code Online (Sandbox Code Playgroud)

或者,如果您在列之间添加它:

# eg: ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED  NULL AFTER field2; 
INSERT INTO newtable SELECT field1, field2, newcolumn = 0, field3 /*etc...*/ FROM oldtable; 
Run Code Online (Sandbox Code Playgroud)

如果要批量执行,可以添加where子句.

一旦所有记录都在那里

DROP TABLE oldtable;
RENAME TABLE newtable to oldtable;
Run Code Online (Sandbox Code Playgroud)

  • 你总是可以直接改变一个表,但我会给你一个我必须在2个月前处理的例子.我有一张包含325,000,000条记录的表格.我们必须添加2列+ 1索引.所以改变那个表很长(因为我们必须对它进行优化),并且该表每天被读取两次用于统计.只是改变了桌子并祈祷它有效吗?我们选择了这个解决方案. (8认同)

lqe*_*qez 11

创建另一个表并更改新表.(像宙斯之书那样)

并且采用ALTER TABLE newtable DISABLE KEYSALTER TABLE newtable ENABLE KEYS之前并插入查询后,可以使其更快.(如下)

CREATE TABLE newtable ....;
ALTER TABLE newtable ....;

ALTER TABLE newtable DISABLE KEYS;
INSERT INTO newtable ....;
ALTER TABLE newtable ENABLE KEYS;

DROP TABLE oldtable;
Run Code Online (Sandbox Code Playgroud)

  • 如果你这样做,不要忘记在所有插入后优化你的桌子 (3认同)
  • ENABLE/DISABLE键仅适用于MyIsam.在InnoDB上,你必须放下键并再次添加它们.可以在添加密钥之前运行优化表.资料来源:http://www.mysqlperformanceblog.com/2010/12/09/thinking-about-running-optimize-on-your-innodb-table-stop/ (3认同)

Dre*_*rew 5

虽然其他答案可以作为向表中添加列所需的语法示例,但NB提供了实际问题的答案:


  • 由于必须转移记录,因此您将获得更多的CPU使用率。
  • 内存使用的角度来看-带有AFTER COLUMN选项和没有AFTER COLUMN选项是相同的
  • 在大多数情况下,会创建一个tmp表。有一些MySQL引擎支持热模式更改(TokuDB是其中之一),这些更改不会创建tmp表并浪费大量资源。
  • 但是,如果使用MyISAM或InnoDB进行此操作- 我会说“ AFTER COLUMN”选项由于记录转移而将花费更多时间。

    注意

  • 可以有一些官方文件的链接来确认吗? (2认同)