2

こんにちは、正規化されていない巨大な mysql データベースがあり、(~1 億) 個の URL (~20% の重複) がそれぞれ 1,300 万行の同一の分割テーブルに分割されています。

URL を同じ mySql サーバー上の正規化されたデータベースに移動したいと考えています。

古いデータベース テーブルは正規化されておらず、URL にはインデックスがありません。次のようになります。

entry{id,data,data2, data3, data4, possition,rang,url}

そして、それを複数のテーブルに分割します。

url{id,url}
data{id,data}
data1{id,data}
etc

私が最初にしたことは

INSERT IGNORE INTO newDatabase.url (url)
SELECT DISTINCT unNormalised.url FROM oldDatabase.unNormalised

しかし、「SELECT DISTINCT unNormalized.url」(1,300 万行) には時間がかかり、「INSERT IGNORE INTO」も比較を行うため、

INSERT IGNORE INTO newDatabase.url (url)
SELECT unNormalised.url FROM oldDatabase.unNormalised

DISTINCT がなければ、この仮定は間違っていますか?

この膨大な量の正規化されていないデータを処理するためのより良い方法はありますか? 1 億行のデータベース全体で SELECT DISTINCT unNormalized.url を実行し、すべての ID をエクスポートしてから、それらの ID のみを新しいデータベースに移動するのに、たとえば php スクリプトを使用するのが最善でしょうか?

すべてのアイデアを歓迎します。1 年もかからずにこの日付すべてを移植する方法がわかりません。

ps rds amazonサーバーでホストされています。

ありがとうございました!

4

1 に答える 1

0

MySQL のマニュアルでは、 は よりも高速であると述べLOAD DATA INFILEられているためINSERT、データをロードする最速の方法は次のようになります。

LOCK TABLES url WRITE;
ALTER TABLE url DISABLE KEYS;
LOAD DATA INFILE 'urls.txt'
    IGNORE
    INTO TABLE url
    ...;
ALTER TABLE url ENABLE KEYS;
UNLOCK TABLES;

しかし、データはすでに MySQL にロードされていますが、それを正規化する必要があるだけなので、次のことを試してみてください。

LOCK TABLES url WRITE;
ALTER TABLE url DISABLE KEYS;
INSERT IGNORE INTO url (url)
    SELECT url FROM oldDatabase.unNormalised;
ALTER TABLE url ENABLE KEYS;
UNLOCK TABLES;

私の推測では、それINSERT IGNORE ... SELECTはよりも高速になると思いますが、それはINSERT IGNORE ... SELECT DISTINCT単なる推測です。

于 2012-09-29T01:25:19.930 に答える