MySQL でテーブルをロックせずに index を貼る方法いろいろ

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

使用例も多く見つかる

ameblo.jp

gh-ost

Goで書かれている最近っぽいアーキテクチャのオンラインDDL

参考リンク

takatoshiono.hatenablog.com