2008-09-21 33 views
9

我有通過ODBC訪問MySQL的C#代碼。帶有數千個插入的MySQL事務 - 需要多少次「往返」?

它創建一個事務,執行幾千條插入命令,然後提交。 現在我的問題是有多少「往返」,可以這麼說,發生在數據庫服務器上?我的意思是,它只是將每個插入命令傳輸到數據庫服務器,還是緩存/緩存它們並分批發送它們?這是可以任何方式配置?

回答

18

MySQL有可以用來擴展SQL的風格,質量刀片把幾個在一個時間:

INSERT INTO `table` (`id`, `event`) VALUES (1, 94263), (2, 75015), (3, 75015); 

我通常會運行的SQL之前收集了幾百個嵌入部分轉換爲字符串查詢自己。這將通過自己批處理來減少解析和通信的開銷。

+1

任何想法有多少套括號(),(),()被視爲'大'?我的意思是,在1個查詢中有多少個擴展插入行(= VALUES後面的括號集)之後,我們應該考慮製作一個新的查詢? – Swanand 2009-01-06 13:44:55

0

很難說沒有看到你的代碼,但我假設你正在執行一個語句。所以,每個插入語句你都會得到一個往返行程。

在MSSQL中,你可以在一個單獨的語句執行多個刀片:

cmd.ExecuteNonQuery "insert table values (1) insert table values (2)" 

所以,你可以創建一個大的字符串,並執行它(我認爲這將有限制),我認爲這會爲MySQL的。

另外在MSSQL中你有一個批量插入器(查找「SqlBulkCopy」),在MySQL中可能試試loading the data from a temp file

+0

我不知道MySQL的ODBC連接,但MySQL本身允許在單次執行中連接多個命令。另外,你可以做水手。例如「INSERT INTO TABLE VALUES('hello','bye'),('what','ever');」所以回答nickf的問題與給定的信息有點困難。 :) – hangy 2008-09-21 12:40:21

2

它爲您提交的每個查詢執行一次往返(不管它是否在交易中)。

在MySQL中,可以使用「擴展插入」語法,該語法允許您在單個語句中插入幾個(或者甚至很多)行。這通常被認爲是一件好事。

0

幾年前,當使用MySQL 4.x時,我們遇到了對不可配置的查詢大小的限制。

這可能不會幫助你多少爲:

  1. 我不記得是什麼硬限制了。
  2. 你可能沒有使用MySQL 4.x.
  3. 我們沒有使用交易。

祝你好運!

2

到數據庫服務器的往返行程與磁盤上數據庫的往返行程不同。

在你決定往返是一個瓶頸之前,做一些實際的測量。

有一些方法可以使用單個插入插入多行,具體取決於您的DBMS。在您投入編碼工作之前,請確定它是否可能對您有所幫助。

0

這取決於您調用SQL語句的位置。我用MySQL JDBC驅動試了一次,發現有一個錯誤,說限制是1MB,但它是可配置的。

我沒有打算嘗試配置它,只是將SQL語句拆分爲更小的部分。

4

本身行數沒有限制;限制是傳輸到服務器的字節數。

您可以構建批量插入,最大爲'允許的最大數據包'中指定的字節數。如果我想使用最少量的插入,我會嘗試。

0

將發送的數據限制取決於您的服務器,因此多個插入語句的最大長度會自動調整爲適合。瓶頸是數據包長度和緩衝區長度。

net_buffer_lengthmax_allowed_packet變量描述的詳細信息:

https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_net_buffer_length https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_allowed_packet

在某些情況下,你可以調整這些(例如傾卸數據時),以不產生過於刀片長但保留多個插入。請注意,如果表中存在一些斑點或其他任何可能超出上述變量值的長整型值,則可能會出現錯誤或數據不完整。