indexを張った場合の処理の基本的な流れ
ALTER TABLE
でindexを追加すると、indexを貼り終わるまでテーブルがロックされる
- 内部的には
テーブルをロック→テーブルをコピー→コピーしたテーブルにindexを貼る→元のテーブルと入れ替える→ロック解除
という処理が行われる
そのため、普通にindexを追加すると長時間DBが使い物にならなくなる
どうしたら良いの?
InnoDBの場合 online alter table
という超スペシャルな機能があって、条件さえ満たしていればロックやテーブルコピーなしにindexが貼れる
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.11 InnoDB とオンライン DDL
online alter table の制約
MySQL 5.6 以前に作られた日時カラムを持つテーブルの場合、最低1回はコピーが必要
- MySQL 5.6にて、日時カラムに浮動小数点が追加されたため
InnoDBじゃない場合は?
古来より、ロックなしに ALTER TABLE
するためのオンラインDDLツールが作られており、それに頼るのが良い
pt-online-schema-change
昔からよく使われていた(と思われる)オンラインDDL
使用例も多く見つかる
gh-ost
Goで書かれている最近っぽいアーキテクチャのオンラインDDL