MySQL や PostgreSQL でトリガーベースの実体化ビューを後から追加する方法 (もしくは無停止での CREATE INDEX)

  • 読み込み>書き込みなデータベースだと、実体化ビュー (materialized view) を使って読み込み速度を上げるってのは有効な手法
  • ちなみに MySQLPostgreSQL だと実体化ビューはトリガーを使って書く *1
  • では、トリガーベースの実体化ビューを後から追加した場合に、どうやって既存データを新しいビューに反映させるのか。
  • UPDATE トリガを、ビューの側に対応するデータがない場合は INSERT トリガと同様の動作をするように実装すればいい (典型的には REPLACE INTO 文を使う)。ビューの初期データ充填は
UPDATE src_table SET id=id;
  • MySQL だと CREATE INDEX CONCURRENTLY がないから副インデックス作成はスレーブでやったりする*2けど、上の UPDATE を LIMIT つきで回すことで、ビューをインクリメンタルに生成することができる (なので、インデックスを追加するかわりに実体化ビューを作るという手もある)

*1:分離レベルは SERIALIZABLE, PostgreSQL なら SELECT FOR UPDATE じゃないといろいろ問題かも

*2:その場合にフェイルオーバーさせるのが面倒とか言うけど、副インデックスってマスターには不要な場合がほとんどじゃないのかなと思ってる