我有通過ODBC訪問MySQL的C#代碼。帶有數千個插入的MySQL事務 - 需要多少次「往返」?
它創建一個事務,執行幾千條插入命令,然後提交。 現在我的問題是有多少「往返」,可以這麼說,發生在數據庫服務器上?我的意思是,它只是將每個插入命令傳輸到數據庫服務器,還是緩存/緩存它們並分批發送它們?這是可以任何方式配置?
我有通過ODBC訪問MySQL的C#代碼。帶有數千個插入的MySQL事務 - 需要多少次「往返」?
它創建一個事務,執行幾千條插入命令,然後提交。 現在我的問題是有多少「往返」,可以這麼說,發生在數據庫服務器上?我的意思是,它只是將每個插入命令傳輸到數據庫服務器,還是緩存/緩存它們並分批發送它們?這是可以任何方式配置?
MySQL有可以用來擴展SQL的風格,質量刀片把幾個在一個時間:
INSERT INTO `table` (`id`, `event`) VALUES (1, 94263), (2, 75015), (3, 75015);
我通常會運行的SQL之前收集了幾百個嵌入部分轉換爲字符串查詢自己。這將通過自己批處理來減少解析和通信的開銷。
很難說沒有看到你的代碼,但我假設你正在執行一個語句。所以,每個插入語句你都會得到一個往返行程。
在MSSQL中,你可以在一個單獨的語句執行多個刀片:
cmd.ExecuteNonQuery "insert table values (1) insert table values (2)"
所以,你可以創建一個大的字符串,並執行它(我認爲這將有限制),我認爲這會爲MySQL的。
另外在MSSQL中你有一個批量插入器(查找「SqlBulkCopy」),在MySQL中可能試試loading the data from a temp file。
我不知道MySQL的ODBC連接,但MySQL本身允許在單次執行中連接多個命令。另外,你可以做水手。例如「INSERT INTO TABLE VALUES('hello','bye'),('what','ever');」所以回答nickf的問題與給定的信息有點困難。 :) – hangy 2008-09-21 12:40:21
它爲您提交的每個查詢執行一次往返(不管它是否在交易中)。
在MySQL中,可以使用「擴展插入」語法,該語法允許您在單個語句中插入幾個(或者甚至很多)行。這通常被認爲是一件好事。
幾年前,當使用MySQL 4.x時,我們遇到了對不可配置的查詢大小的限制。
這可能不會幫助你多少爲:
祝你好運!
到數據庫服務器的往返行程與磁盤上數據庫的往返行程不同。
在你決定往返是一個瓶頸之前,做一些實際的測量。
有一些方法可以使用單個插入插入多行,具體取決於您的DBMS。在您投入編碼工作之前,請確定它是否可能對您有所幫助。
這取決於您調用SQL語句的位置。我用MySQL JDBC驅動試了一次,發現有一個錯誤,說限制是1MB,但它是可配置的。
我沒有打算嘗試配置它,只是將SQL語句拆分爲更小的部分。
本身行數沒有限制;限制是傳輸到服務器的字節數。
您可以構建批量插入,最大爲'允許的最大數據包'中指定的字節數。如果我想使用最少量的插入,我會嘗試。
將發送的數據限制取決於您的服務器,因此多個插入語句的最大長度會自動調整爲適合。瓶頸是數據包長度和緩衝區長度。
見net_buffer_length
和max_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
在某些情況下,你可以調整這些(例如傾卸數據時),以不產生過於刀片長但保留多個插入。請注意,如果表中存在一些斑點或其他任何可能超出上述變量值的長整型值,則可能會出現錯誤或數據不完整。
任何想法有多少套括號(),(),()被視爲'大'?我的意思是,在1個查詢中有多少個擴展插入行(= VALUES後面的括號集)之後,我們應該考慮製作一個新的查詢? – Swanand 2009-01-06 13:44:55