本文共 666 字,大约阅读时间需要 2 分钟。
众所周知,对于
前阵子,发现一条sql的性能明细不正常,几千条
调了一下代码,翻到了mysql-connector里,关键的代码是这么一块:
if (!this.batchHasPlain
可以看到有executeBatchedInserts和executeBatchSerially两个分支,如果执行到executeBatchSerially的话,其实就是执行了个“假的”batch, 在这个方法里会每条数据单独去跟mysql交互。
为了能顺利的执行进executeBatchedInserts, 可以看到有一些先决条件:batchHasPlainStatements, connection.getRewriteBatchedStatements(), canRewriteAsMultiValueInsertAtSqlLevel。
事实上,为了能顺利的执行批量sql, mysql的驱动会对sql做一次“改写(
insert into ()
改写完之后,变成了这样:
insert into () values () () ()
变成了一条sql, 当然就是与mysql交互一次了。
成功rewrite后,才能批量执行sql。上边的几个条件也基本都是为了能让sql进行改写。这里边关键的其实就是两个点,一是数据库连接层面,需要
insert into () set x=x,y=y
这种语法本身不属于sql标准,是mysql的“方言”,也是没有批量操作的形式的。因此,如果把sql写成这种形式,就不然没法执行真正的批量操作了。
转载地址:https://blog.csdn.net/weixin_34262786/article/details/113589716 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!