使用事务时批量插入MySQL是否有任何意义?

时间:2015-03-29 16:00:36

标签: java mysql sql

具体来说,我正在使用MySQL v5.5.41并使用Java JDBC执行插入(驱动程序是mysql-connector-java-5.1.30),虽然我不知道我使用的驱动程序是否相关。

我正在运行一次性应用程序,在7个表中插入相当多的行。我的每个“条目”(与相同数据相关的行)由6个表中的可变行数组成,而另一个表中的单个行与其他表相关(大约10-20行要插入)每个“条目”的所有7个表格,但偶尔可能会有更多)。

我将每个“条目”插入包装在已插入条目的所有行之后提交的事务中。

我的问题是,是否有必要将行插入批处理到我的每个表中,这通常需要多行插入,例如在Java中使用addBatch()batchExecute()

例如,如果我要为表中的每个行插入调用executeUpdate()函数(没有批处理),我正在使用的JDBC库是否优化,最终只发出一个多值插入我稍后提交了交易?或者,如果在这些情况下有优化,也许它是由MySQL本身执行的?

2 个答案:

答案 0 :(得分:2)

仍有多个陈述 - 因此有多个航班请求。使用事务 not 会影响语句的执行方式(或者为执行这些语句而进行批处理)。

事务完全在MySQL引擎本身内发生。使用事务是一个步骤,它对性能有很大帮助,主要是因为'提交' (以及相关的数据刷新/同步)本身就会减少。

对于低延迟连接,性能将是等效的。然而,批处理仍然可以在更高的延迟中起作用。连接。这是因为单个语句必须仍然往返服务器。 (例如,每秒最多可执行200个语句的5ms连接。)

在任何情况下,最终的性能答案都是'是特定负载/任务/配置下的基准。

答案 1 :(得分:1)

无论交易如何,批量都很重要。

在许多测试中,我看到一个单独的INSERT有100行而不是100个1行INSERTs时,速度提高了大约10倍(不是10%)。 (对于“同一台机器”,等待时间很短,但不为零。)

考虑一下语句的所有开销-网络延迟,进程交换,解析和许多互斥体。