「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > テーブルをロックせずに大規模な MySQL 本番テーブルにインデックスを作成するにはどうすればよいですか?

テーブルをロックせずに大規模な MySQL 本番テーブルにインデックスを作成するにはどうすればよいですか?

2024 年 11 月 17 日に公開
ブラウズ:591

How to Create an Index on a Large MySQL Production Table Without Table Locking?

テーブルをロックせずに大規模な MySQL 運用テーブルにインデックスを作成する方法

問題の背景:

大規模な MySQL テーブルにインデックスを作成することは、特に中断のないアクセスが重要な運用環境では、困難な作業になる可能性があります。従来の CREATE INDEX ステートメントでは、テーブルが完全にロックされ、すべての同時操作がブロックされる可能性があります。

MySQL バージョンに関する考慮事項:

  • MySQL 5.6 以降では、インデックスが更新されます。オンラインで実行されるため、インデックス作成中に読み取りおよび書き込み操作を継続できます。
  • ただし、MySQL 5.5 以前では、 InnoDB および MyISAM テーブルでは、インデックスの更新によりテーブルへの書き込みがブロックされます。

循環マスター アプローチ:

MySQL バージョン 5.6 より前の場合、効果的なアプローチの 1 つは次のとおりです。循環マスター手法:

  1. プライマリ マスター (マスター) から複製するセカンダリ マスター (マスター B) をセットアップします。 A).
  2. マスター B でスキーマの更新を実行します (アップグレード中の遅れを許容します)。
  3. スキーマの変更がマスター A のダウンバージョン スキーマからのコマンドの複製と互換性があることを確認します。 .
  4. すべてのクライアントをマスター A からマスター B に原子的に切り替えます。
  5. マスター A のスキーマを更新して、

Percona の pt-online-schema-change ツール:

このツールは次の方法で循環マスター アプローチを自動化します:

  • 更新されたスキーマを使用して新しいテーブルを作成します。
  • 新しいテーブルを保持します。トリガーを使用して元のテーブルと同期します。
  • 元のテーブルから行をバッチでコピーします。
  • 元のテーブルを新しいテーブルに置き換えます。

]AWS RDS の考慮事項:

Amazon の RDS でホストされている MySQL データベースの場合、「リードレプリカ プロモーション」機能を使用できます。テーブルをロックせずにスキーマ変更を容易にするために使用されます。これには、読み取り専用スレーブに変更を加え、それを新しいマスターに昇格させることが含まれます。

代替テクニック:

  • 一時的なスレーブを使用するtable: 新しいインデックスを使用して一時テーブルを作成し、元のテーブルからデータを挿入し、元のテーブルを一時テーブルに置き換えます。 table.
  • テーブルのパーティション化: テーブルを小さなパーティションに分割し、各パーティションに個別にインデックスを作成してから、パーティションをマージして戻します。
  • バックグラウンド プロセスを使用する: テーブルが通常の操作でアクセス可能なままである間に、インデックスを段階的に作成する別のバックグラウンド プロセスを作成します。このアプローチは、すべての MySQL バージョンでサポートされているわけではありません。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3