想请教一下各位大佬们有什么方式可以更快的从DB删除数据吗?
我们目前的query是:
DELETE FROM {{table_name}}
WHERE company_id = 'xyz'
AND allocation_month = '2024-01-01'
ORDER BY created
LIMIT 50000;
目前非常慢,需要40-50s才能删除50,000行
想请教一下各位大佬们有什么方式可以更快的从DB删除数据吗?
我们目前的query是:
DELETE FROM {{table_name}}
WHERE company_id = 'xyz'
AND allocation_month = '2024-01-01'
ORDER BY created
LIMIT 50000;
目前非常慢,需要40-50s才能删除50,000行
最好是能改造分区表,通过分区的方式去truncate更快
https://docs.pingcap.com/zh/tidb/stable/dev-guide-delete-data/#批量删除例子
写脚本批量删除好点
社区也有人写过工具,可以看下: 专栏 - 使用tidb-toolkit批量删除/更新数据 | TiDB 社区
受 TiDB MVCC 机制影响,delete xxx limit xx; 这种方式删除大量数据,后续会越来越慢,因为需要扫描的数据变多了
可以用窗口函数批处理方式删除数据:https://docs.pingcap.com/zh/tidb/stable/dev-guide-paginate-results/#单字段主键表的分页批处理
或者其他同学开发的脚本:专栏 - 绕过 MVCC 影响的 TiDB Delete 数据方法 | TiDB 社区
非事务 DML 语句用于在特定场景下绕过大事务的事务大小限制,用一条语句完成原本需要拆分成多个事务完成的任务,且执行效率更高,占用资源更少。
例如,对于一个删除过期数据的需求,在确保没有任何业务会访问过期数据时,适合使用非事务 DML 语句来提升删除性能。
参考下文章:https://docs.pingcap.com/zh/tidb/v7.5/non-transactional-dml/#非事务-dml-语句
TiDB 是一个分布式 HTAP 数据库,虽然支持DELETE操作,但并不是所有场景下都适合用这种方式进行大规模数据清理。建议将删除任务拆分成多个小批次,通过多个连接并行执行。
谢谢大佬们,我之前看到社区贴子这个下面有推荐用BATCH (ON test.t2.id) LIMIT 1,想请教一下大佬们我这个情况下可以用BATCH 么?
BATCH ON xxx.id LIMIT 5000 delete from xxx where xxx; 我都是这么删除数据的,where条件要有索引,把order by去掉
单表条件用BATCH应该没什么问题,之前试过JOIN,BTCH就有些不太对劲了。不过对加速也是没帮助的