truncate table是对表做删除标记还是对行做删除标记?

truncate table是对表做删除标记还是对行做删除标记?
drop table呢?

drop/truncate 到GC时间后直接清理sst 物理删除数据
https://docs.pingcap.com/zh/tidb/stable/garbage-collection-overview#gc-机制简介

2 个赞

tidb底层都是keyvalue,truncate或者drop表实际上就是将所有的key打标为删除标记,然后会记录到mysql.gc_delete_range表中,在到达gc时间之后,会将对应的key进行删除,所以在gc时间内,实际上在tidb中truncate或者drop表是可以被找回的。

1 个赞

我理解是对行做删除标记 :yum:

1 个赞

按文档说的是对region做的删除标记

:ok_hand::ok_hand::ok_hand:

1 个赞

对region的话那出现多个表用同一个region呢?

按这个文档,是对region做的删除标记
如果出现多个表用同一个region呢?

看这个 ddl闪回原理

1 个赞

按照key、value打上删除标签的,多组key、value数据组成一个region

1 个赞

感谢大佬 :ghost:又get到了flashback table的原理

region

有GC机制啊

补充下,truncate table操作 每次table_id 都会变化

应该是对行做标记

准确一些来 说,先delete ranges 整区间的数据
再do GC 删除 每一个节点上key旧版本

truncate table和delete table区别是什么呢,为什么都建议使用truncate table清除数据

delete table 在tidb会是一个写入操作,数据量反而变大,而且很慢,数据量大会oom

嗯,delete会记录日志,占用磁盘空间,一段时间GC会释放磁盘空间。但是truncate不会记录日志,相对好一些

释放非常困难,delete的GC并不能释放磁盘。