5

私がやろうとしているのは、JOINを使用して3番目のテーブルからターゲットテーブルに情報を追加しながら、CSVをテーブルにアップロードすることです。

CSV の import.csv (100 万行) は次のようになります。

firstname | lastname

ターゲット テーブルの「名前」は次のようになります。

firstname | lastname | gender

そして、テーブル「性別」(70万行)は次のようになります。

firstname | gender

したがって、私の理想的なクエリは次のようになります。

LOAD DATA LOCAL INFILE "import.csv"
INTO TABLE names n
LEFT JOIN gender g ON(g.firstname=n.firstname)

それらの線に沿って、インポートと結合を組み合わせて、名前の最終結果に性別とCSVからのデータが含まれるようにします。

ただし、LOAD DATA LOCAL INFILE を JOIN と組み合わせることはできず、各行に INSERT と JOIN を使用しようとすると CPU の負荷が高すぎることはわかっています。

何か案は?

4

3 に答える 3

12

SET句を使用LOAD DATA INFILEして目標を達成できます

LOAD DATA LOCAL INFILE '/path/to/your/file.csv'
INTO TABLE names
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' -- or '\r\n' if file has been prepared in Windows
IGNORE 1 LINES -- use this if your first line contains column headers 
(@first, @last)
SET firstname = @first,
    lastname = @last,
    gender = 
    (
      SELECT gender 
        FROM gender
       WHERE firstname = @first
       LIMIT 1
    )

次のことを確認してください。

  • テーブルのfirstname列にインデックスがありますgender
  • namesデータをロードする前に、テーブルにインデックスがありません。読み込みが完了したら、それら (インデックス) を追加します。
于 2013-09-01T01:58:00.757 に答える