我有一个有 500 万行的大型 MySQL InnoDB 表。我需要在表中添加一个具有默认int
值的列。
最好的方法是什么?正常的 alter table 命令似乎需要很长时间。有没有更好的方法呢?基本上我想知道是否有更快的方法或有效的方法。
如果表有外键引用,除了alter table之外还有什么方法可以做到这一点?
任何帮助表示赞赏。
我有一个有 500 万行的大型 MySQL InnoDB 表。我需要在表中添加一个具有默认int
值的列。
最好的方法是什么?正常的 alter table 命令似乎需要很长时间。有没有更好的方法呢?基本上我想知道是否有更快的方法或有效的方法。
如果表有外键引用,除了alter table之外还有什么方法可以做到这一点?
任何帮助表示赞赏。
我不会说这是更好的方法,但是......您可以为新数据创建一个单独的表并将其设置为与现有表的外键关系。那将是“快”,但是如果数据确实属于主表并且每个(或大多数)现有记录都有一个值,那么您应该只更改表并添加它。
假设表格如下所示:
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;
试试看 !!!