欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TiDB中addBatch/executebatch无效、效率慢

程序员文章站 2022-03-06 21:24:40
...

默认 Batch 只是将多次 addBatch 的 SQL 发送时机延迟到调用 executeBatch 的时候,但实际网络发送还是会一条条的发送,通常不会降低与数据库服务器的网络交互次数。如果希望 Batch 网络发送批量插入,需要在 JDBC 连接参数中配置 rewriteBatchedStatements=true

默认情况下虽然使用了 batch 但发送到 TiDB 语句还是单独的多条 insert:

insert into t(a) values(10);insert into t(a) values(11);insert into t(a) values(12);

如果设置 rewriteBatchedStatements=true,发送到 TiDB 的 SQL 将是:

insert into t(a) values(10),(11),(12);

需要注意的是,insert 语句的改写,只能将多个 values 后的值拼接成一整条 SQL,insert 语句如果有其他差异将无法被改写。例如:

insert into t (a) values (10) on duplicate key update a = 10;insert into t (a) values (11) on duplicate key update a = 11;insert into t (a) values (12) on duplicate key update a = 12;

将无法被改写成一条语句。该例子中,如果将 SQL 改写成如下形式:

insert into t (a) values (10) on duplicate key update a = values(a);insert into t (a) values (11) on duplicate key update a = values(a);insert into t (a) values (12) on duplicate key update a = values(a);

即可满足改写条件,最终被改写成:

insert into t (a) values (10), (11), (12) on duplicate key update a = values(a);


**补充说明:insert into ... on duplicate key update ... values()的含义
1. on duplicate key update 含义:
  1)如果在INSERT语句末尾指定了 on duplicate key update,
      并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,
      则在出现重复值的行执行UPDATE;
  2)如果不会导致唯一值列重复的问题,则插入新行。
 
2. values(col_name)函数只是取当前插入语句中的插入值,并没有累加功能。
  如:count = values(count) 取前面 insert into 中的 count 值,并更新
        当有多条记录冲突,需要插入时,前面的更新值都被最后一条记录覆盖,
        所以呈现出取最后一条更新的现象。
  如:count = count + values(count) 依然取前面 insert into 中的 count 值,
        并与原记录值相加后更新回数据库,这样,当多条记录冲突需要插入时,
        就实现了不断累加更新的现象。
 
注:insert into ... on duplicate key update ... values() 这个语句
    尽管在冲突时执行了更新,并没有插入,但是发现依然会占用 id 序号(自增),
    出现很多丢失的 id 值

 

相关标签: TIDB