具体来说,我正在使用MySQL v5.5.41并使用Java JDBC执行插入(驱动程序是mysql-connector-java-5.1.30),虽然我不知道我使用的驱动程序是否相关。
我正在运行一次性应用程序,在7个表中插入相当多的行。我的每个“条目”(与相同数据相关的行)由6个表中的可变行数组成,而另一个表中的单个行与其他表相关(大约10-20行要插入)每个“条目”的所有7个表格,但偶尔可能会有更多)。
我将每个“条目”插入包装在已插入条目的所有行之后提交的事务中。
我的问题是,是否有必要将行插入批处理到我的每个表中,这通常需要多行插入,例如在Java中使用addBatch()
和batchExecute()
?
例如,如果我要为表中的每个行插入调用executeUpdate()
函数(没有批处理),我正在使用的JDBC库是否优化,最终只发出一个多值插入我稍后提交了交易?或者,如果在这些情况下有优化,也许它是由MySQL本身执行的?
答案 0 :(得分:2)
仍有多个陈述 - 因此有多个航班请求。使用事务 not 会影响语句的执行方式(或者为执行这些语句而进行批处理)。
事务完全在MySQL引擎本身内发生。使用事务是一个好步骤,它对性能有很大帮助,主要是因为'提交' (以及相关的数据刷新/同步)本身就会减少。
对于低延迟连接,性能将是等效的。然而,批处理仍然可以在更高的延迟中起作用。连接。这是因为单个语句必须仍然往返服务器。 (例如,每秒最多可执行200个语句的5ms连接。)
在任何情况下,最终的性能答案都是'是特定负载/任务/配置下的基准。
答案 1 :(得分:1)
无论交易如何,批量都很重要。
在许多测试中,我看到一个单独的INSERT
有100行而不是100个1行INSERTs
时,速度提高了大约10倍(不是10%)。 (对于“同一台机器”,等待时间很短,但不为零。)
考虑一下语句的所有开销-网络延迟,进程交换,解析和许多互斥体。