我正在使用Java和mybatis。
我有这样的查询,我需要在key_b
上为2000个值执行此操作。这意味着我需要运行sql 2000次。这是相当慢的。
DELETE FROM my_table
WHERE key_a = xxx
AND key_b = yyy
现在我想出了另一个解决方案,这次我在IN
key_b
条款中发送了1000个值。这意味着我只执行两个查询。我期待这个至少更快。但这似乎比上面的更慢。这是sql。
DELETE FROM my_table
WHERE key_a = xxxx
AND key_b IN (y1, y2, ... y1000)
有关更多信息,key_b是主键。 key_a是一个外键,有一个索引。
另一件事,我已经尝试取出会话并在所有sqls执行后进行提交。但它没有那么大的改善。
答案 0 :(得分:0)
我的意思是如果你有一个有id列的表。
然后您可以将值插入该表:
insert into temp_table
select 1 from dual -- your ids
union all
select 2 from dual
union all
select 3 from dual
union all
......
填写temp_table后,你可以运行:
DELETE FROM my_table
WHERE key_a = xxxx
AND key_b IN
(
select id from temp_table
);
答案 1 :(得分:0)
我建议坚持第一种方法:在id集合的Java循环中调用准备好的Delete语句。当然,使用ExecutorType REUSE或BATCH,以便为每条记录准备一次并运行该语句。 此外,我不鼓励尝试绑定数千个参数。
无论如何,我担心这是你能做的最好的事情,因为Delete操作会检查每条记录的完整性约束,可能是更新索引。那不是"批量"。