2011-12-12 41 views
5

我有一個數據庫表如下圖所示:如何插件20萬人次的紀錄到MySql數據庫儘可能快

create table temperature 
(id int unsigned not null auto_increment primary key, 
temperature double 
); 

而在我的節目,我得到了2000萬左右的溫度要插入到表中。 我在.Net環境中工作,使用Connector/Net連接到MySql。代碼如下:

List<double> temps = new List<double>(); 
... 
string connStr = "server=localhost;user=name;database=test;port=3306;password=*****;"; 
MySqlConnection conn = new MySqlConnection(connStr); 
try 
{ 
    conn.Open(); 

    //temps.Count is about 20 million 
    for (int i = 0; i < temps.Count; i++) 
    { 
     string sql1 = "INSERT INTO temperature VALUES (null, "+temps[i]+")"; 
     MySqlCommand cmd1 = new MySqlCommand(sql1, conn); 
     cmd1.ExecuteNonQuery(); 
    } 

} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 
conn.Close(); 

如何插入如此多的行數據儘可能快? (它只能插入我的計算機2000條記錄每分鐘)。

+1

我有點好奇。爲什麼要在數據庫中插入20百萬個溫度? –

+0

你需要自動增量嗎?我有類似的情況(在SQL服務器上),我在加載器上管理增量密鑰客戶端。我在當前的硬件上每秒處理75,000行。沒有SQL,雖然... – TomTom

+0

也是你的SQL「糟糕」;)你不能在一次運行中提交多個插入語句嗎?它是一個字符串 - 可以mysql處理hthat嗎?往返行程10次,每程往返10%。 THreads添加莫爾(多線程負載)。 – TomTom

回答

5

您可以使用bulk insert其在同一時間執行許多刀片減少調用ExecuteNonQuery多次的開銷概念。

在MySQL這就是所謂的LOAD DATA,請查看詳情:http://dev.mysql.com/doc/refman/5.5/en/load-data.html

MS SQL Server中這就是所謂的bulk insert和它被稱爲這樣,這就是爲什麼我用這個名字提到它。

0

一般規則: -

  1. use load data infile
  2. 導入過程中禁用鍵,使之回的所有數據後,已進口
  3. 運行在數據庫服務器本身的腳本,連接使用套接字而不是TCP的/ ip

大部分提示都在文檔中解釋。

+0

通用規則#2在這裏不適用,因爲它是自動編號主鍵 –

4

有許多方法可以優化批量插入。一些是:

  • LOAD DATA INFILE。有一個wrapper API for .NET。這是最快的方法,但與簡單插入有一些限制和語義差異。

  • 多行INSERT聲明:

    INSERT INTO temperature (temperature) VALUES (1.0), (2.0), (3.0), ...

    你不應該一次插入20.000.000行,但可能想嘗試1.000-10.000一個非常大的加速。這是一種簡單且非常不成問題的提高速度的方法。通常可能有10倍,有時更多。

  • 鎖定表(LOCK TABLES)。

  • 暫時禁用索引。

  • MySQL選項調整。

  • INSERT DELAYED(在這裏很可能沒那麼有用)。

該文檔確實爲您提供了more elaborate detail的選項。某些選項取決於表格類型(InnoDBMyISAM)。

一般建議:始終指定在VALUES之前插入的列。這使得更易維護的代碼。

相關問題