2008-09-21 112 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

在某些情况下,你可以调整这些(例如倾卸数据时),以不产生过于刀片长但保留多个插入。请注意,如果表中存在一些斑点或其他任何可能超出上述变量值的长整型值,则可能会出现错误或数据不完整。