关于ALTER TABLE ADD COLUMN的性能问题

时间:2013-04-09 14:47:43

标签: mysql sql performance

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

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

如果表有外键引用,除了alter table之外还有其他方法吗?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

假设表格如下:

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;

试一试!!!

相关问题