tidb删除数据很慢

上周深圳地区交流会刚分享的

1 个赞

加配置看看有没有提升

BATCH (ON test.t2.id) LIMIT 1 指定拆分列时需要完整的数据库名、表名和列名,例如test.t2.id
BATCH 语句在某一列将 DML 语句涉及的范围划分为多个区间,在每个区间执行一条 SQL。
不保证 事务的原子性和隔离性
注意

看删除的比例, 如果是删除占比大的话, 可考虑将保留的数据插入到新表,然后再改名, 删除原表

第一:单主键批量删除采用分页批处理与普通索引+LIMIT的方式从执行计划上对比结果如下
1、采用时间字段索引+LIMIT的方式批处理数据,执行计划要么全表扫描要么回表。
2、采用分页批处理的方式,对于聚簇表使用主键ID+时间,可以避免回表动作;对于非聚簇表使用主键ID不能避免回表或全表扫描的动作,可以使用_tidb_rowid避免回表动作。
3、不论是聚簇表还是非聚簇表的整型主键使用AUTO_RANDOM或者AUTO_INCREMENT,在获取分页查询信息后,如果还有其他的表数据保留策略,都需要加上相应的条件字段,就需要加时间字段,否则数据不准确。
第二:从TiDB采用RocksDB的底层架构上来看,删除会出现更多的MVCC版本,会导致删除越来越慢
综合第一和第二来看,你这个慢是理所当然的,说白了要用聚簇索引搞事情,普通二级索引是非唯一的,参考MySQL总用主键ID删除数据去理解但是TiDB这里不能只用主键ID做事情,否则会发现数据可能被误删除了

批量删除试了吗