2020年4月16日木曜日

【MySQL】インデックス作成はテーブルを一時コピーして作らない。

なぜこんなことを記事にしているのか。

 仕事上、MySQLのALTER TABLE文は、テーブルを一時的にコピーしてから新旧テーブルを入れ替える形で処理されていると知った。 そうなのか!?と驚き、検索をかけた。


どこにそんなことが書かれているのか。

 下記記事を参照。

ALTER TABLEを上手に使いこなそう。


MySQLのドキュメントはどうだろうか。

 以下のリンク先に書かれていた。

13.1.7 ALTER TABLE 構文

一部引用すると

ストレージ、パフォーマンス、および並列性に関する考慮事項

ほとんどの場合、ALTER TABLE は元のテーブルの一時的なコピーを作成します。MySQL は、そのテーブルを変更しているほかの操作を待ってから、処理を続行します。そのコピーに変更を組み込み、元のテーブルを削除したあと、新しいテーブルの名前を変更します。

ALTER TABLE後のテーブル定義でコピーを作って、最終的にそちらを使うことになっている。


インデックス作成はどうなのか。

 やりたかったのはインデックス作成なので、それはどうなのだろうかとドキュメントを追ってみたところ、以下の引用部分を発見した。

一部の操作では、一時テーブルを必要としないインプレース ALTER TABLE が可能です。
  • ・・・
  • InnoDB と NDB に対するインデックスの追加または削除。

インデックス作成と削除は大丈夫ということだ。一安心した。InnoDBというのは検索をすればすぐに答えが出てくるので、気にしなくてよい。