简体   繁体   中英

Performance concerns regarding ALTER TABLE ADD COLUMN

I have a big MySQL InnoDB table having 5 million rows. I need to add a column to the table which will have a default int value.

What is the best way to do it? The normal alter table command appears to take a lot of time. Is there any better way to do it? Basically I want to know if there is any faster way or efficient way of doing it.

And if the table has foreign key references, is there any way other than alter table to do this?

Any help appreciated.

I would not say this is a better way, but ... You could create a separate table for the new data and set it up as foreign key relationship to the existing table. That would be "fast", but if the data really belongs in the main table and every (or most) existing records will have a value, then you should just alter the table and add it.

Suppose the table looked like this:

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

and you want to add an age column with

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

You could perform the ALTER TABLE in stages as follows:

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;

If mytable uses the MyISAM Storage Engine and has nonunique indexes, add two more lines

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;

This will let you see how many seconds each stage takes. From here, you can decide whether or not a straightforward ALTER TABLE is better.

This technique gets a little gory if there are foreign key references.

Your steps would be

  • SET UNIQUE_CHECKS = 0;
  • SET FOREIGN_KEY_CHECKS = 0;
  • Drop the foreign key references in mytable .
  • Perform the ALTER TABLE in Stages
  • Create the foreign key references in mytable .
  • SET UNIQUE_CHECKS = 1;
  • SET FOREIGN_KEY_CHECKS = 1;

Give it a Try !!!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM