我有通过ODBC访问MySQL的C#代码。
它创建一个事务,执行几千个插入命令,然后提交。 现在我的问题是,有多少“往返”可以说是针对数据库服务器发生的?我的意思是,它只是将每个插入命令传输到数据库服务器,还是缓存/缓冲它们并分批发送?这可以以任何方式配置吗?
答案 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时,我们遇到了无法配置的查询大小的硬限制。
这可能对你没有多大帮助:
答案 6 :(得分:0)
这取决于您调用SQL语句的位置。我用MySQL JDBC驱动程序尝试了一次,并且出现了一个错误,说限制是1MB,但它是可配置的。
我没有费心去尝试配置它,只是将SQL语句拆分成更小的部分。
答案 7 :(得分:0)
将发送的数据限制取决于您的服务器,因此多个插入语句的最大长度会自动调整为适合。瓶颈是数据包长度和缓冲区长度。
有关详细信息,请参阅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
在某些情况下,您可以调整这些(例如,在转储数据时)以不生成太长但仍保留多个插入的插入。请注意,如果表中有一些blob或任何其他可能超出上述变量值的长值,则可能会出现错误或数据不完整。