我经常写这样的插页:
query = "
INSERT INTO
SomeTable (Column1, Column2)
VALUES
#{data.map { |row| "(#{row[0]},#{row[1]})" }.join(?,)}
"
但是,当我的数据数量达到数十万时,我不禁想到正在创建的大量字符串。有没有更合适的方法来做到这一点?所有的字符串插值看起来都很臭。
我使用的是mysql2版本0.3.15。请注意,这不是Rails或Active Record相关的。
答案 0 :(得分:1)
我创建了以下基准来比较哪种concat方法在您的方案中更好。看起来你正在使用更好的。
user system total real
<< 6.540000 0.000000 6.540000 ( 6.541577)
+ 7.580000 0.000000 7.580000 ( 7.590544)
#{one}#{two} 5.700000 0.000000 5.700000 ( 5.703538)
require 'benchmark'
values = Array.new(1000){ |i| [i.to_s, (i+1).to_s] }
Benchmark.bm(20) do |x|
x.report ('<<') do
10_000.times do
values.map { |row| "(" << row[0] << "," << row[1] << ")" }.join(?,)
end
end
x.report('+') do
10_000.times do
values.map { |row| "(" + row[0] + "," + row[1] + ")" }.join(?,)
end
end
x.report('#{one}#{two}') do
10_000.times do
values.map { |row| "(#{row[0]},#{row[1]})" }.join(?,)
end
end
end
答案 1 :(得分:1)
如果要加载大量数据,可以创建CSV文件,将其移动到数据库服务器并让数据库管理器直接加载它。它会快得多。
有关详细信息,请参阅“13.2.6 LOAD DATA INFILE Syntax”。
答案 2 :(得分:0)
问题的一部分是查询是作为字符串发送的,所以无论你怎么做,你最终都需要创建一个字符串。对于您的具体示例,我建议批量查询。只需在循环中执行一部分数据,以避免构造大量字符串并过度强调数据库。
我不太了解ruby string internals,告诉你构建字符串的最佳方法,但是批量很大(一次可能有100条记录)你应该对你拥有的东西很好。