0

csv から SQL データベースに 70,000 エントリをインポートする必要があります。残念ながら、これによりサーバーの負荷が非常に高くなり、最終的にサーバーがクラッシュします。一括 SQL インポートhttp://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/に関するこの記事を読んでいたところ、フラッシュが必要であると書かれていました。これに対処するには、これらのコレクションを定期的に消去する簡単な方法を作成することです。

その後、スクリプトは非常に迅速に実行されます。別の言語ですが、PHP の代替手段はありますか? フラッシュまたはガベージ コレクションのいずれかです。1 回のループで 70,000 のエントリをインポートする最良の方法は何ですか?

この記事では、MySQL インデックスを使用して負荷を軽減することについても言及していますが、PHP でもこれにどのようにアプローチすればよいでしょうか?

ありがとう

Psまた、それはSQLだと思いますか、それともCSVリーダーですか?

4

1 に答える 1

0

次に試すことができます:

TableShadowCopyを実行します。(ライブテーブルの場合、この方法でサイトのハングを回避できます。それ以外の場合は、この手順をスキップできます)

DROP TABLE IF EXISTS __shadow_table; // droping previous shadow table if exists
CREATE TABLE __shadow_table LIKE table; // COPY source table structue
CREATE TABLE IF NOT EXISTS __shadow_table SELECT * FROM table; // possible use of WHERE statemnet

これで、ソーステーブルの正確なコピーが作成され、インポート中に「サイトダウン」の結果を心配する必要がないことを実行できます。

新しく作成されたテーブルのインデックスを無効にする

ALTER TABLE __shadow_table DISABLE KEYS;

これで、テーブルへのインポートを実行できます(__shadow_table)。

試してくださいLOAD DATA LOCAL INFILEFILE許可が必要です)

許可がない 場合は使用FILEBULK INSERT

INSERT INTO __shadow_table (col1, col2, col3, col4) VALUES (1,2,3,4), (6,7,8,9), (20,30,40,60);

テーブル(シャドウテーブル)のENABLEインデックス

ALTER TABLE __shadow_table ENABLE KEYS;

DROPオリジナルテーブル

DROP TABLE IF EXISTS table

シャドウテーブルの名前を元の(DROPped)名に変更します

RENAME TABLE __shadow_table TO table;

インポート中にインデックスを無効にすると、データ挿入時の負荷とHDD検索を減らすことができます。また、テーブルがの場合はInnoDBFOREIGN_KEY_CHECKSを無効にする必要があります。インポート中に無効にされたものはすべて、インポートの終了までに有効にする必要があります。

于 2012-07-26T08:29:17.780 に答える