具有数千个Inserts的MySQL事务-它需要进行多少次"往返"?
我有通过ODBC访问MySQL的Ccode。
它创建一个事务,执行数千个插入命令,然后提交。
现在,我的问题是,针对数据库服务器发生了多少次"往返"?我的意思是,它只是将每个插入命令发送到数据库服务器,还是将它们缓存/缓冲并分批发送?并且可以以任何方式配置吗?
解决方案
没有看到代码很难说,但是我假设我们一次执行一个语句。因此,我们将在每个插入语句中获得一次往返。
在MSSql中,我们可以在单个语句中执行多个插入操作:
cmd.ExecuteNonQuery "insert table values (1) insert table values (2)"
因此,我们可以创建一个大字符串并执行它(我认为它将有一个限制),我认为这将适用于MySQL。
同样在MSSQL中,我们有一个批处理插入器(查找" SqlBulkCopy"),在MySQL中,也许尝试从临时文件中加载数据。
它会对我们提交的每个查询进行一次往返(无论它是否在事务中)。
在MySQL中,可以使用"扩展插入"语法,该语法允许我们在单个语句中插入几行(甚至很多行)。这通常被认为是一件好事。
几年前使用MySQL 4.x时,我们遇到了无法配置的查询大小的硬限制。
这可能对我们没有多大帮助:
- 我不记得有什么硬限制。
- 我们可能没有使用MySQL4.x。
- 我们没有使用交易。
祝你好运!
到数据库服务器的往返与到磁盘上数据库的往返不同。
在确定往返行程是瓶颈之前,请进行一些实际测量。
根据DBMS,可以通过一次插入来插入多行。在我们投入编码工作之前,请弄清楚这是否可能对我们有好处。
MySQL具有可以使用的扩展SQL样式,其中一次将大量插入放入多个插入中:
INSERT INTO `table` (`id`, `event`) VALUES (1, 94263), (2, 75015), (3, 75015);
我通常会在运行SQL查询本身之前将数百个插入部分收集到字符串中。通过自己进行批处理,将减少解析和通信的开销。
这取决于我们在哪里调用SQL语句。我曾经用MySQL JDBC驱动程序尝试过一次,但收到一个错误消息,说限制为1MB,但它是可配置的。
我不必费力尝试配置它,而只是将SQL语句拆分为较小的部分。
本身的行数没有限制;限制是传输到服务器的字节数。
我们可以建立批量插入,最多达到"最大允许的数据包"中指定的字节数。如果我想使用最少的插入量,我会尝试的。