ライブmyISAMテーブルにインデックスを追加する最も簡単な方法は何ですか?

StackOverflow https://stackoverflow.com/questions/1601735

  •  05-07-2019
  •  | 
  •  

質問

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

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

更新:「オンラインインデックス操作」について読むSQL Serverのおかげで http://msdn.microsoft.com/en -us / library / ms191261.aspx :)

ありがとう!

役に立ちましたか?

解決

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

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

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

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

他のヒント

私はランディと一緒です。私たちも同様の状況にあり、MySQLには次のようなことを実現する2つの方法があります。

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

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

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

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

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

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

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

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

または静かな時間にスケジュールする...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top