mysql - MySQL `ALTER TABLE ADD COLUMN AFTER COLUMN` 的性能 - 在大表上

标签 mysql

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

ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;

与没有 AFTER COLUMN 选项的相同命令相比,此选项所花费的时间是否会显着延长,如下所示?

ALTER TABLE foo ADD COLUMN bar;

第一个命令会在执行过程中使用更多的 tmp table 空间来执行操作吗?

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

最佳答案

我会这样做:

CREATE TABLE newtable LIKE oldtable;
ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NOT NULL DEFAULT 0; 

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

INSERT INTO newtable SELECT field1, field2, field3 /*etc...*/, newcolumn = 0 FROM oldtable; 

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

# 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; 

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

一旦所有记录都在那里

DROP TABLE oldtable;
RENAME TABLE newtable to oldtable;

关于mysql - MySQL `ALTER TABLE ADD COLUMN AFTER COLUMN` 的性能 - 在大表上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8190228/

相关文章:

mysql - 恢复特定表中的数据

php - 为什么在使用 WordPress 的 $wpdb 获取数据库行时,int 列返回为字符串?

php - 使用 PDO 而不是 mysql_*

mysql - 使用 CONVERT_TZ 会导致性能问题吗?

php - 在使用 6 个连接表进行选择查询期间检索到错误的 ID

php - 将一个 SQL 表中的行链接到不同表中的多行,

mysql - 更改 Automysqlbackup 的执行时间

mysql - 存储多媒体帖子 SQL DB 的最佳实践

C# 网站与 mySQL 数据库的连接

MySQL 缓存结果?