mysql - 高速化 - oak-online-alter-table




ALTER TABLE ADD COLUMNに時間がかかる (2)

ALTER TABLE文は、mysqlが新しいカラムを含むテーブルのすべての単一の行を書き直さなければならないことを意味します。 2百万行以上の行があるため、かなりの時間がかかることが予想されますが、その間にサーバーが大部分のIOバウンドになる可能性があります。 あなたは通常、次のことを行う方がより効果的であることがわかります:

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

このようにして、空のテーブルに列を追加し、基本的には、新しいテーブルにデータを書き込んで、他の誰も見ていないことを確かめます。

私は、データベース内のテーブル(main_table)に "location"という列を追加しようとしていました。 私が実行したコマンドは

ALTER TABLE main_table ADD COLUMN location varchar (256);

main_tableには、2,000,000を超える行が含まれています。 それは2時間以上継続しており、まだ完了していません。

mytopを使用してこのデータベースのアクティビティを監視して、クエリが他のクエリプロセスによってロックされていないことを確認しようとしましたが、そうではないようです。 それは長い時間がかかりますか? 実際には、このコマンドを実行する前にマシンを再起動したばかりです。 このコマンドはまだ実行中です。 私は何をすべきか分かりません。


あなたのケースのような大きなデータでAlter Tableには長い時間がかかりますので、このような状況では使用しないでください。このようなコードを使用してください:

select main_table.*, 
  cast(null as varchar(256)) as null_location, -- any column you want accepts null
  cast('' as varchar(256)) as not_null_location, --any column doesn't accept null
  cast(0 as int) as not_null_int, -- int column doesn't accept null
into new_table 
from main_table;

drop table main_table;
rename table new_table TO main_table;




alter