【问题标题】:Performance concerns regarding ALTER TABLE ADD COLUMN关于 ALTER TABLE ADD COLUMN 的性能问题
【发布时间】:2013-04-09 14:47:42
【问题描述】:

我有一个包含 500 万行的大型 MySQL InnoDB 表。我需要在表中添加一列,该列将具有默认的 int 值。

最好的方法是什么?正常的 alter table 命令似乎需要很长时间。有没有更好的方法呢?基本上我想知道是否有更快或更有效的方法。

如果表有外键引用,除了alter table还有什么办法吗?

任何帮助表示赞赏。

【问题讨论】:

  • 这可能需要很长时间,因为正在进行数据更改。您是否设置了默认值?
  • 是的.. 我设置了一个默认值。该列是整数,默认值为 1。
  • 就可以了。添加列是元数据操作,通常很快,但是通过设置默认值,它变成了需要对表的每一行执行的数据操作。对于一张大桌子,这需要一些时间。

标签: mysql sql performance


【解决方案1】:

我不会说这是更好的方法,但是……您可以为新数据创建一个单独的表并将其设置为与现有表的外键关系。那将是“快”,但如果数据确实属于主表并且每个(或大多数)现有记录都有一个值,那么您应该只更改表并添加它。

【讨论】:

    【解决方案2】:

    假设表格如下所示:

    CREATE TABLE mytable
    (
        id INT NOT NULL AUTO_INCREMENT,
        name VARCHAR(25),
        PRIMARY KEY (id),
        KEY name (name)
    );
    

    你想添加一个年龄列

    ALTER TABLE mytable ADD COLUMN age INT NOT NULL DEFAULT 0;
    

    您可以分阶段执行ALTER TABLE

    CREATE TABLE mytablenew LIKE mytable;
    ALTER TABLE mytablenew ADD COLUMN age INT NOT NULL DEFAULT 0;
    INSERT INTO mytablenew SELECT id,name FROM mytable;
    ALTER TABLE mytable RENAME mytableold;
    ALTER TABLE mytablenew RENAME mytable;
    DROP TABLE mytableold;
    

    如果 mytable 使用 MyISAM 存储引擎并且具有非唯一索引,则再添加两行

    CREATE TABLE mytablenew LIKE mytable;
    ALTER TABLE mytablenew ADD COLUMN address VARCHAR(50);
    ALTER TABLE mytablenew DISABLE KEYS;
    INSERT INTO mytablenew SELECT id,name FROM mytable;
    ALTER TABLE mytable RENAME mytableold;
    ALTER TABLE mytablenew RENAME mytable;
    DROP TABLE mytableold;
    ALTER TABLE mytable ENABLE KEYS;
    

    这将使您了解每个阶段需要多少秒。从这里,您可以决定简单的ALTER TABLE 是否更好。

    如果有外键引用,这种技术会有点血腥。

    你的步骤是

    • SET UNIQUE_CHECKS = 0;
    • SET FOREIGN_KEY_CHECKS = 0;
    • 删除mytable 中的外键引用。
    • 分阶段执行ALTER TABLE
    • mytable 中创建外键引用。
    • SET UNIQUE_CHECKS = 1;
    • SET FOREIGN_KEY_CHECKS = 1;

    试试看!!!

    【讨论】:

    • 我会试试这个,如果有任何改进,请告诉您。我对我的问题做了一些修改。我想知道如果有外键引用有什么办法吗?
    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 2011-11-27
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多