rubyスクリプト大csvファイルクイックバッチinsert mysqlインポート
2510 ワード
今日mysqlデータベースに数百MBのcsvファイルをインポートします.データベースフィールドが作成されていますが、どのようにインポートするかは問題です.mysql workbenchにインポート機能が付いていて、理想的ではなく、使えません.なぜなら、独自の一括インポートpythonスクリプトのソースコードは文字セットの問題を考慮していないため、インポートが終了するとエラーが発生し、数百行のデータしかインポートされていないことに気づきます.明らかにだめだ.そして自分に頼るしかない.
こんなに大きなファイルをインポートするコードは以前書いたことがありませんが、いくつかの方法を試してみましたが、一つはいいです.
1つ目の方法:insert行を1行読みます.この方法は効率が低く、私の機械では、約1000行を1分間導入しなければなりません.私のは10万行で、約100分で約1時間半かかります.
第2の方法:1000行を読んで、先にキャッシュして、それからinsertの前の1000行、それから1000行を読んで、それからinsert.この方法は実験したほうがいい.早速、約2分で導入が終わりました.
第3の方法:10万行のファイルを読み終わった後、1つのinsert文でインポートします.この方法は理想化されていますが、試してみましたが、我慢している間に結果が出ず、遅いと思います.
方法はいくつか試してみましたが、具体的には具体的に分析しなければなりません.例えば、1000行のinsert 1000行を読んでいますが、いったい1000という数字は適切ですか.キャッシュとしてどのくらいの行を選択すればいいのでしょうか.これは他の達人に聞いてみます.私は白です.何も知りません.
Rubyコードは次のように書かれています.私を吹き飛ばさないでください.どうせ使えます.
以下から抜粋します.http://database.51cto.com/art/201010/229046.htm
MySQLは、1つのINSERT文を使用して複数のレコードを挿入する別のソリューションを提供します.これは標準的なSQL構文ではないので、MySQLでしか使用できません.
INSERT INTO users(name, age)
VALuES('姚明',25),('ビル・ゲイツ',50),('火星人',600);
上のINSERT文はusersテーブルに連続して3つのレコードを挿入した.なお、上記INSERT文のVALES以降は、各レコードの値をペア(…)に入れ、「,」で分割する必要があります.テーブルtable 1があると仮定
CREATE TABLE table1(n INT);
table 1に5つのレコードを挿入する場合は、次の書き方が間違っています.
INSERT INTO table1 (i) VALUES(1,2,3,4,5);
MySQLは次のエラーを投げ出します
ERROR 1136: Column count doesn't match value count at row 1
正しい書き方はこうです.
INSERT INTO t able1(i) VALUES(1),(2),(3),(4),(5);
もちろん、このような書き方では、列名を省略することもできます.これにより、括弧のペアごとに値の数が一致し、その数が列数と一致しなければなりません.次のようになります.
INSERT INTO t able1 VALUES(1),(2),(3),(4),(5);
こんなに大きなファイルをインポートするコードは以前書いたことがありませんが、いくつかの方法を試してみましたが、一つはいいです.
1つ目の方法:insert行を1行読みます.この方法は効率が低く、私の機械では、約1000行を1分間導入しなければなりません.私のは10万行で、約100分で約1時間半かかります.
第2の方法:1000行を読んで、先にキャッシュして、それからinsertの前の1000行、それから1000行を読んで、それからinsert.この方法は実験したほうがいい.早速、約2分で導入が終わりました.
第3の方法:10万行のファイルを読み終わった後、1つのinsert文でインポートします.この方法は理想化されていますが、試してみましたが、我慢している間に結果が出ず、遅いと思います.
方法はいくつか試してみましたが、具体的には具体的に分析しなければなりません.例えば、1000行のinsert 1000行を読んでいますが、いったい1000という数字は適切ですか.キャッシュとしてどのくらいの行を選択すればいいのでしょうか.これは他の達人に聞いてみます.私は白です.何も知りません.
Rubyコードは次のように書かれています.私を吹き飛ばさないでください.どうせ使えます.
# -*- coding:utf-8 -*-
require 'mysql2'
client=nil
infile=nil
begin
client = Mysql2::Client.new(:host => "localhost", :username => "root", :password => "", :database => "")
infile=File.new("");
number=1
buffer=""
infile.each do |line|
array=(line.strip+",").split(",")
string="(#{number},'#{array[0]}','#{array[1]}',#{array[2]},'#{array[3]}')"
if(number%1000==0)
buffer+=string
sql="insert into XXX values #{buffer};"
client.query(sql)
buffer=""
puts number
else
buffer+=string+","
end
#puts sql
number+=1
end
sql="insert into XXX values #{buffer.chop};"
client.query(sql)
rescue
#puts "error"
puts $!
puts $@
ensure
client.close
infile.close
end
以下から抜粋します.http://database.51cto.com/art/201010/229046.htm
MySQLは、1つのINSERT文を使用して複数のレコードを挿入する別のソリューションを提供します.これは標準的なSQL構文ではないので、MySQLでしか使用できません.
INSERT INTO users(name, age)
VALuES('姚明',25),('ビル・ゲイツ',50),('火星人',600);
上のINSERT文はusersテーブルに連続して3つのレコードを挿入した.なお、上記INSERT文のVALES以降は、各レコードの値をペア(…)に入れ、「,」で分割する必要があります.テーブルtable 1があると仮定
CREATE TABLE table1(n INT);
table 1に5つのレコードを挿入する場合は、次の書き方が間違っています.
INSERT INTO table1 (i) VALUES(1,2,3,4,5);
MySQLは次のエラーを投げ出します
ERROR 1136: Column count doesn't match value count at row 1
正しい書き方はこうです.
INSERT INTO t able1(i) VALUES(1),(2),(3),(4),(5);
もちろん、このような書き方では、列名を省略することもできます.これにより、括弧のペアごとに値の数が一致し、その数が列数と一致しなければなりません.次のようになります.
INSERT INTO t able1 VALUES(1),(2),(3),(4),(5);