0

mySQL で myISAM テーブルを実稼働環境で実行しています。いくつかのテストを行った結果、特定の複合インデックスを追加することでクエリを大幅に高速化できることがわかりました。ここまでは順調ですね。ただし、テーブルを長時間ロックせずに実稼働環境にこのインデックスを追加する最良の方法については、実際にはわかりません (27 GB のデータがあるため、それほど多くはありませんが、しばらく時間がかかります)。

ヒントはありますか?もちろん、これがより洗練されたセットアップである場合は、別のマシンにすべてのデータのライブ レプリカがあり、安全に切り替えることができます。残念ながら、私たちはまだそこに達していません。できるだけ早くこのクエリを高速化したいと考えています (これは、顧客の大きな頭痛の種になっています)。データをレプリケートしてからスワップアウト トリックを実行する簡単な方法はありますか? 私が見逃している他のトリックはありますか?

更新: SQL Server の「オンライン インデックス操作」について読むと、とてもうらやましくなりますhttp://msdn.microsoft.com/en-us/library/ms191261.aspx :)

ありがとう!

4

4 に答える 4

3

レプリケーションを使用すると、そのテーブルにインデックスを作成するのにかかる時間ではなく、数分程度のダウンタイムを得ることができます。

スレーブをセットアップするには、http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html を参照してください

プロセスを高速化するために私ができる推奨事項は、ステップ2で「生データファイルを使用してデータスナップショットを作成する」方法に従うことです。ただし、ワイヤを介してスレーブにコピーする代わりに、マスターの別の場所にコピーします。コピーが完了したらすぐにマスターをバックアップし、構成ファイルに必要な変更を加えます (サーバー ID を設定し、バイナリログを有効にします)。これにより、ダウンタイムがわずか 1 ~ 2 分に短縮されます。サーバーがバックアップされたら、コピーしたファイルをスレーブ ボックスにコピーできます。

スレーブを起動して実行し、すべてが適切に複製されていることを確認したら、スレーブを一時停止できます。軟膏にインデックスを作成します。インデックスの作成が完了したら、スレーブを再開します。これにより、スレーブがマスターに追いつきます。マスターでは、FLUSH TABLE WITH READ LOCK を使用します。スレーブのステータスをチェックして、マスターとスレーブのログ位置が一致していることを確認してください。その場合は、スレーブをシャットダウンし、そのテーブルのファイルをマスターにコピーして戻します。

于 2009-10-21T16:25:48.420 に答える
1

私はランディと一緒です。私たちは似たような状況にあり、MySQL でこのようなことを達成するには 2 つの方法があります。

  1. 実行中にサーバーを停止します。これはおそらくあなたがすることです。シンプルで、簡単で、機能します。する時間は?ディスクの帯域幅にもよりますが、おそらく 30 分/45 分です。下記参照。

  2. 新しいインデックスで新しいテーブルを作成し、すべてのデータをコピーし、サーバーを一時停止して最初のテーブルを削除し、新しいテーブルを古い名前に変更し、サーバーを起動します。ダウンタイム?たぶん10分ですが、本当に複雑です。

オプション 2 が機能し、インデックス作成のダウンタイムを節約できます (時間がかかる場合)。しかし、より多くのスペースが必要で、より複雑です (メイン テーブルから挿入された新しいレコードを処理する必要があり、データをコピーしている間に MyISAM でロックされる可能性があるためです。テーブルの削除には時間がかかり、テーブルを次のように変更します)。新しい名前には時間がかかります. 本当に複雑です. 2TB のテーブルがあれば便利かもしれませんが、27G の場合はおそらくやり過ぎです.

本番サーバーに近い仕様の 2 台目のサーバーはありますか? 最新のバックアップをロードし、そこにインデックスを作成します。これにより、追加にかかる時間を知ることができます。次に、ダウンタイムを計画します。

InnoDB は多くの点で優れていますが、新しいインデックスは依然としてテーブルをロックします。MSSQL (および私は PostgreSQL だと思います) がロックせずにそのようなことを行う能力は素晴らしいでしょう。

于 2009-10-21T16:01:40.057 に答える
0

使用率の低いウィンドウを見つけて、インデックスの作成中にアプリケーションをオフラインにします。レプリケーションもマルチマスターも何も持っていないので、これで弾丸を噛む必要があります. 午前 1 時にお会いしましょう。:-)

于 2009-10-21T15:55:32.610 に答える
0

ここでは、1 つのサーバーでできることはあまりありません。

テーブルをコピーして予行演習を行うと、少なくともライブ テーブルをロックせずにどれくらいの時間がかかるかがわかるので、必要に応じてメンテナンスの時間をスケジュールするか、単にプッシュするかどうかを決定できます。ボタンを押して、ユーザーを数分間ハングさせたままにします:)

または、静かな時間をスケジュールしてください...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
于 2009-10-21T16:00:31.887 に答える