Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ALTER TABLE ADD COLUMN takes a long time

I was just trying to add a column called "location" to a table (main_table) in a database. The command I run was

ALTER TABLE main_table ADD COLUMN location varchar (256); 

The main_table contains > 2,000,000 rows. It keeps running for more than 2 hours and still not completed.

I tried to use mytop to monitor the activity of this database to make sure that the query is not locked by other querying process, but it seems not. Is it supposed to take that long time? Actually, I just rebooted the machine before running this command. Now this command is still running. I am not sure what to do.

like image 900
fanchyna Avatar asked Sep 29 '11 15:09

fanchyna


People also ask

How long does ALTER TABLE add column take?

We have done migration of over 4 billion rows with this, though it can take upto 10 days, with less than a minute of downtime.

Is ALTER TABLE slow?

If using older version, ALTER TABLE is still the fastest—but will probably be horribly slow because all of your data will be re-inserted to a temporary table under the hood.


1 Answers

Your ALTER TABLE statement implies mysql will have to re-write every single row of the table including the new column. Since you have more than 2 million rows, I would definitely expect it takes a significant amount of time, during which your server will likely be mostly IO-bound. You'd usually find it's more performant to do the following:

CREATE TABLE main_table_new LIKE main_table; ALTER TABLE main_table_new ADD COLUMN location VARCHAR(256); INSERT INTO main_table_new SELECT *, NULL FROM main_table; RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; DROP TABLE main_table_old; 

This way you add the column on the empty table, and basically write the data in that new table that you are sure no-one else will be looking at without locking as much resources.

like image 160
Romain Avatar answered Sep 17 '22 13:09

Romain