【问题标题】:Performance of MySQL ALTER TABLE ADD COLUMN AFTER COLUMN - on a large tableMySQL ALTER TABLE ADD COLUMN AFTER COLUMN 的性能 - 在大表上
【发布时间】:2011-11-18 23:04:18
【问题描述】:

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

   ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;

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

   ALTER TABLE foo ADD COLUMN bar;

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

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

【问题讨论】:

  • 表格是否经常读取?是合并表吗?
  • 这是一张普通的桌子。读取数据没有问题。
  • 这个表在很多mysql程序中使用吗? php代码? (或其他代码)?
  • 您将获得更多的 CPU 使用率,因为必须转移记录。从内存使用的角度来看 - 它与 AFTER COLUMN 选项相同,没有它。在大多数情况下,会创建一个 tmp 表。有些 MySQL 引擎支持热模式更改(TokuDB 就是其中之一),它们不会创建 tmp 表并浪费大量资源。但是,如果您使用 MyISAM 或 InnoDB 执行此操作 - 我会说“AFTER COLUMN”选项会由于记录移位而花费更多时间。
  • @Drew ;在极少数情况下,您添加新列的位置有时会影响此类命令完成所需的时间。但是.. Does it use a different amount of (or any for that matter) tmp table space to perform the action?,您是否会碰巧使用@BookOfZeus 提供的方法?

标签: mysql


【解决方案1】:

我会这样做:

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 内部执行方式 (dev.mysql.com/doc/refman/5.0/en/alter-table-problems.html) 有何不同。好吧,您不执行重命名步骤是不同的。此外,这种方法不考虑在 oldtable 上具有外键的表,因此如果 oldtable 确实存在,您将无法删除它们。对于这个问题,我认为答案不应该假设不存在。
  • 你总是可以直接改变一个表,但我会给你一个我在两个月前不得不处理的例子。我有一张包含 325,000,000 多条记录的表格。我们必须添加 2 列 + 1 个索引。所以修改该表非常长(因为我们必须对其进行优化)并且该表每天读取两次以进行统计。只是简单地改变了桌子并祈祷它有效吗?我们选择了这个解决方案。
【解决方案2】:

创建另一个表并更改新表。 (就像宙斯之书所做的那样)

并且在插入查询前后使用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;

【讨论】:

【解决方案3】:

虽然其他答案可用作向表中添加列所需的语法示例,但实际问题的答案由 N.B. 提供:


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

    ——N.B.

【讨论】:

  • 能有官方文档链接确认一下吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2023-03-11
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多