具有数千个插入的MySQL事务 - 需要多少次“往返”?

时间:2008-09-21 12:26:22

标签: sql mysql database

我有通过ODBC访问MySQL的C#代码。

它创建一个事务,执行几千个插入命令,然后提交。 现在我的问题是,有多少“往返”可以说是针对数据库服务器发生的?我的意思是,它只是将每个插入命令传输到数据库服务器,还是缓存/缓冲它们并分批发送?这可以以任何方式配置吗?

8 个答案:

答案 0 :(得分:18)

MySQL具有可以使用的扩展SQL样式,其中大量插入一次放入几个:

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

在运行SQL查询本身之前,我通常会将几百个插入部分收集到一个字符串中。这将通过自己批量处理来减少解析和通信的开销。

答案 1 :(得分:4)

行数本身没有限制;限制是传输到服务器的字节数。

您可以构建批量插入,最多可达“max allowed packet”中指定的字节数。如果我想使用最少量的插入物,我会尝试。

答案 2 :(得分:2)

它为您提交的每个查询进行一次往返(无论是否在交易中)。

在MySQL中,可以使用“扩展插入”语法,该语法允许您在单个语句中插入多个(或实际上很多)行。这通常被认为是一件好事。

答案 3 :(得分:2)

到DB服务器的往返行程与磁盘上数据库的往返行程不同。

在您确定往返行程是瓶颈之前,请先进行一些实际测量。

根据您的DBMS,有多种方法可以使用单个插入插入多行。在您投入编码工作之前,先确定它是否可能对您有所帮助。

答案 4 :(得分:0)

很难说没有看到你的代码,但我假设你一次只执行一个语句。因此,每次插入声明将获得一次往返。

在MSSql中,您可以在一个语句中执行多个插入:

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

所以你可以创建一个大字符串并执行它(我认为它会有一个限制),我认为这适用于MySQL。

同样在MSSQL中你有一个批量插入器(查找“SqlBulkCopy”),在MySQL中可能会尝试loading the data from a temp file

答案 5 :(得分:0)

几年前使用MySQL 4.x时,我们遇到了无法配置的查询大小的硬限制。

这可能对你没有多大帮助:

  1. 我不记得硬限制是什么。
  2. 您可能没有使用MySQL 4.x.
  3. 我们没有使用交易。
  4. 祝你好运!

答案 6 :(得分:0)

这取决于您调用SQL语句的位置。我用MySQL JDBC驱动程序尝试了一次,并且出现了一个错误,说限制是1MB,但它是可配置的。

我没有费心去尝试配置它,只是将SQL语句拆分成更小的部分。

答案 7 :(得分: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

在某些情况下,您可以调整这些(例如,在转储数据时)以不生成太长但仍保留多个插入的插入。请注意,如果表中有一些blob或任何其他可能超出上述变量值的长值,则可能会出现错误或数据不完整。