テーブル ロックを使用せずに大規模な MySQL 本番テーブルにインデックスを作成する方法
問題の背景:
大規模な MySQL テーブルにインデックスを作成することは、特に本番環境では困難な作業になる可能性があります。中断のないアクセスが重要です。従来の CREATE INDEX ステートメントでは、テーブルが完全にロックされ、すべての同時操作がブロックされる可能性があります。
MySQL バージョンの考慮事項:
- MySQL 5.6 以降では、インデックスが更新されます。オンラインで実行されるため、インデックス作成中に読み取りおよび書き込み操作を継続できます。
- ただし、MySQL ではInnoDB および MyISAM テーブルを含む 5.5 以前では、インデックスの更新によりテーブルへの書き込みがブロックされます。
循環マスター アプローチ:
5.6 より前の MySQL バージョンの場合効果的なアプローチの 1 つは、循環マスター手法です。
- セカンダリをセットアップするプライマリ マスター (マスター A) から複製するマスター (マスター B)。
- マスター B でスキーマの更新を実行します (アップグレード中の遅れを許容します)。
- スキーマが変更されていることを確認します。マスター A 上のダウンバージョン スキーマからのコマンドの複製と互換性があります。
- すべてのクライアントをマスター A からマスターに自動的に切り替えますB.
- マスター A のスキーマを更新し、セカンダリ マスターにします。
Percona の pt-online-schema-change ツール:
このツールは循環マスターアプローチを自動化します方法:
- 更新されたスキーマを使用して新しいテーブルを作成します。
- トリガーを使用して、新しいテーブルと元のテーブルの同期を維持します。
- 行をバッチでコピーします元のテーブルから。
- 元のテーブルを新しいテーブルに置き換えます。 table.
AWS RDS の考慮事項:
Amazon の RDS でホストされている MySQL データベースの場合、「リードレプリカ プロモーション」機能を使用すると、スキーマの変更を容易にすることができます。テーブルのロック。これには、読み取り専用スレーブに変更を加え、それを新しいマスターに昇格させることが含まれます。
代替テクニック:
-
一時的なスレーブを使用するtable: 新しいインデックスを使用して一時テーブルを作成し、元のテーブルからデータを挿入し、元のテーブルを一時テーブルに置き換えます。 table.
-
テーブルのパーティション化: テーブルを小さなパーティションに分割し、各パーティションに個別にインデックスを作成してから、パーティションをマージして戻します。
-
バックグラウンド プロセスを使用する: テーブルが通常の操作でアクセス可能なままである間に、インデックスを段階的に作成する別のバックグラウンド プロセスを作成します。このアプローチは、すべての MySQL バージョンでサポートされているわけではありません。
以上がテーブルをロックせずに大規模な MySQL 本番テーブルにインデックスを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。