0

InnoDB テーブルの int(1) 型の列に少なくとも 1 つのインデックスを追加する必要があります。インデックスが必要な行数は約 300 万行です。これは私の運用サーバー上のデータベースであり、毎日何千人もの人々が使用しています。標準的な方法でインデックスを追加しようとしましたが、時間がかかりすぎて (プロセスを強制終了する前に約 7 分間実行させました)、行をロックしていたため、多くのユーザーにとってアプリケーションがフリーズしていました。

これらすべてを実行する私の VPS には 512 MB の RAM と Intel Xeon E5504 プロセッサが搭載されています。

ユーザー エクスペリエンスを中断することなく、この運用データベースにインデックスを追加するにはどうすればよいですか?

4

2 に答える 2

0

テーブルが XOR 書き込みを読み取らない限り、おそらくサイトを停止する必要があります。データベースをロックし、操作を実行して待機します。

テーブルが書き込みのみの場合は、書き込みを一時テーブルにスワップし、古いテーブルで操作を実行してから、古いテーブルに書き込みをスワップし、一時テーブルからデータを挿入します。

テーブルが読み取り専用の場合は、テーブルを複製し、コピーに対して操作を実行します。

テーブルが読み取り/書き込みである場合、機能する可能性のある面倒な代替手段は、インデックスを使用して新しいテーブルを作成し、主キーの開始点を元のテーブルの次の値に設定し、読み取り要求に結合を追加して選択することです両方のテーブルから書き込みますが、新しいテーブルに排他的に書き込みます。次に、古いテーブルから新しいテーブルに挿入し、古いテーブルの行を削除するスクリプトを作成します。ダウンタイムよりもはるかに長い時間がかかり、多くの問題が発生する可能性がありますが、実行できるはずです.

主キーの開始点を設定できます

ALTER TABLE `my_table` AUTO_INCREMENT = X;

それが役立つことを願っています。

于 2012-09-02T20:31:52.100 に答える
0

pt-online-schema-change を見てください。このツールはあなたの場合に非常に役立つと思います。明らかにデータベース サーバーに追加の負荷がかかりますが、ほとんどの操作時間でテーブルへのアクセスがブロックされることはありません。

于 2012-09-02T20:17:05.180 に答える