2014-03-06 89 views
0

大量插入我通常寫我插入這樣的:與mysql2寶石

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

但我不敢去想正在創造大量的字符串時,在幾十萬我的數據數量。有沒有更適當的方法來做到這一點?所有的字符串插值看起來真的很臭。

我正在使用mysql2版本0.3.15。請注意,這不是Rails或Active Record相關的。

回答

1

如果您正在加載大量數據,則可以創建一個CSV文件,將其移至數據庫服務器並讓數據庫管理器直接加載它。它會更快。

有關更多信息,請參閱「13.2.6 LOAD DATA INFILE Syntax」。

0

問題的一部分是查詢是以字符串形式發送的,所以無論您如何操作,您最終都需要創建一個字符串。對於您的具體示例,我會建議批量處理您的查詢。只需在循環中執行一部分數據以避免構建大型字符串,並且過分強調數據庫。

我對Ruby字符串內部信息不夠了解,以告訴您構建字符串的最佳方式,但批量很大(一次可能記錄100條記錄),您應該對所擁有的內容適用。

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 
+0

感謝您的信息! – Max