带有mysql2 Gem的大插页

时间:2014-03-06 22:29:13

标签: mysql ruby mysql2

我经常写这样的插页:

query = "
  INSERT INTO
    SomeTable (Column1, Column2)
  VALUES
    #{data.map { |row| "(#{row[0]},#{row[1]})" }.join(?,)}
"

但是,当我的数据数量达到数十万时,我不禁想到正在创建的大量字符串。有没有更合适的方法来做到这一点?所有的字符串插值看起来都很臭。

我使用的是mysql2版本0.3.15。请注意,这不是Rails或Active Record相关的。

3 个答案:

答案 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条记录)你应该对你拥有的东西很好。