【 TiDB 使用环境】生产环境 or 测试环境 or POC
【 TiDB 版本】
关于批量数据删除,看到有如下一段介绍:
在删除大量数据的时候,建议使用 Delete * from t where xx limit 5000;
这样的方案,通过循环来删除,用 Affected Rows == 0
作为循环结束条件。
如果一次删除的数据量非常大,这种循环的方式会越来越慢,因为每次删除都是从前向后遍历,前面的删除之后,短时间内会残留不少删除标记(后续会被 GC 清理掉),影响后面的 Delete
语句。如果有可能,建议把 Where
条件细化。举个例子,假设要删除 2017-05-26 当天的所有数据,那么可以这样做:
for i
from 0
to
23
:
while
affected_rows
> 0
:
delete
*
from
t
where insert_time
>= i:
00 :
00 and
insert_time
< (
i
+1) :
00 :
00 limit
5000; ``
affected_rows
= select
affected_rows
()
上面是一段伪代码,意思就是要把大块的数据拆成小块删除,以避免删除过程中前面的 Delete 语句影响后面的 Delete 语句。
问题:
为什么要采取这种方式进行呢?有什么考虑吗?
【遇到的问题】
【复现路径】做过哪些操作出现的问题
【问题现象及影响】
【附件】
请提供各个组件的 version 信息,如 cdc/tikv,可通过执行 cdc version/tikv-server --version 获取。