2011-01-26 19 views
1

制約とインデックスを含むMYSQLの別のテーブルに基づいてテーブルを作成する必要があります。インデックスを含む別のテーブルに基づいてテーブルを作成する

表A-は、数百万行におそらく存在します

は、私は次のシナリオを持っています。 テーブルAと全く同じテーブルB(制約とインデックスを含む)を作成したいと思います。 Aと他のソースからデータを処理してBに挿入します。 ドロップテーブルA(テーブルAに関連付けられたドロップインデックス)の処理の最後に、インデックスを含むテーブルBをAにリネームします。

これを行うにはどのような方法が最適ですか?パフォーマンスは私の真の関心事です。このような場合には

答えて

1

おかげで、我々はあなたがテーブルの構造を知っていると仮定します。言い換えれば、「これらの列、索引および制約のすべてがどのようなものであるかをどのように見つけ出すか」という質問はしていません。

第二に、我々はB.

からコピーしている間に、あなたの「他のソースは、」ワイルドカードである制約を強制する必要はありませんので、テーブルAのすべてのデータが有効であることを前提とする傾向があります。私はあなたがこの他のソースに有効なデータが含まれている場合は知らない、と示唆していると仮定しています:

1)Bを作成し、W/O indecesまたは制約

2)「その他のソース」からのコピー/一括挿入するにB

3)無効な行を見つけるためにSELECTSを発行して制約を実行します。データが有効であることがわかっている場合は、この手順をスキップしてください。進んでいい場合は、

4)「チャンク」でAをBにコピーします。ここで問題となるのは、すべてのX個の何百万行もの行のSELECT ... INTO ...は、1回の暗黙のトランザクションでそれを行うために必要なリソースが爆発的に増加するためです。永遠に取る(なぜなら、一度に1つの行を行うのはちょっと普通だからです)。したがって、一度に1000または10000行のチャンクを処理します。

5)すべてのデータがコピーされ、indeces

6を追加)が制約

7を追加)

8ドロップ) `CREATE TABLEをB

+0

の名前を変更... LIKE oldtableはここで便利になるかもしれませんが、インデックス定義をコピーします。 –

+1

ありがとうMarc、LIKEを使用している可能性があります。私のためらっているのは、LIKE ..ステートメントに関する以下の説明のためです。 CREATE TABLE ... LIKEは、元のテーブルまたは外部キー定義に指定されたDATA DIRECTORYまたはINDEX DIRECTORYテーブルオプションを保持しません。現在、私はテーブルに外部キーを持っていないので、おそらくこれで行くでしょう。 @ケン、元のテーブルの内容を新しいデータで同時に処理する必要があるので、あなたが提案した通りにはできません。 – Mahesh

関連する問題