使用jdbc在mysql-db中进行批量删除,哪种方法更好。
我有一份主键清单。需要删除它们。
- 使用提供的批更新api
- 删除have where子句have in子句
在WHERE子句中使用IN更快,因为它减少了数据传输。然而,也有一个折衷方案,因为如果查询太长,MySQL需要时间来解析它。如果要删除的记录太多,我建议您将其拆分为10K长度的查询。
另一个解决方案是,当你有太多的记录要删除,并且你通过另一个查询得到它们时,你可以直接使用,例如:
DELETE FROM table1 WHERE id IN (SELECT id FROM table2 WHERE status = 1)
我遇到了类似的问题,决定使用准备好的语句和JDBC驱动程序对这两种方法进行基准测试。我的应用程序有3个(高度索引的)表。我有一个查询来检索我需要从每个表中删除的键的列表(键在所有三个表中都有索引,主键在其中一个表中)。
我第一次尝试:
SELECT id FROM table1 WHERE delete_condition
带
for each delete_id
DELETE FROM table1 WHERE table1.id = delete_id
DELETE FROM table2 WHERE table2.id = delete_id
DELETE FROM table3 WHERE table3.id = delete_id
loop
我发现这提供了每秒74行的删除率。
第二种方法:
DELETE FROM table2 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition)
DELETE FROM table3 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition)
DELETE FROM table1 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition)
提供了每秒43026行的删除速率。我不确定MySQL背后发生了什么,但从现在起,我将使用DELETE FROM表WHERE id IN()方法。