我有一个拥有500万行的大型MySQL InnoDB表。我需要在表中添加一个具有默认int
值的列。
最好的方法是什么?正常的alter table命令似乎需要花费很多时间。有没有更好的方法呢?基本上我想知道是否有更快的方法或有效的方法。
如果表有外键引用,除了alter table之外还有其他方法吗?
任何帮助表示感谢。
答案 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;
试一试!!!