关于gc和compact

delete后续进行的compaction是系统自动进行的吗

有一点我觉得tidb可以改进下,比如用detele清空表,应该可以像truncate一样直接delete_range

这里面怎么执行的我没看过代码,不太清楚是不是有这个。

对,系统自动完成

搞定了吗

:+1: :+1: :+1:

还可以测一下把gc调长一点,先不让它gc是不是空间会暴涨,中间的增大或减少,是不是因为delete的写入数据导致的

不让它gc是不是空间会暴涨, 这个以前测过,tidb删除数据就是插入条新数据

gc后空region就会合并,compact后合并sst文件释放空间

实践出真理!

从我测的来看,gc后,空regions很难触发merge,而是容量逐步变小,sst文件占用空间在compact空间就释放了,sst文件进行了合并。如图,容量在变小,regions数量始终226个

gc 改小+ compact 不知道能不能对 mvcc 导致的select * limit 1 有效起作用

测试单机1tikv数据库,只有一张表 ,插入1亿数据进行每次10万条删除,可以看到sst文件在删除过程总和在变大或者变小反复,可以认为tikv在进行compact,compact会先建新文件然后删除旧文件,然后文件总体积就变化了。
image

后期经过手工compact,sst文件数量最后只剩下3个(可以认为tikv 有3个cf,所以至少3个sst文件)

这三个sst文件在手工几次compact后只剩下几百k
image

了解,这个系统自动触发的频率是多少

看来delete数据后,要多次手工compact后,空间会释放出来

不是必要的,自动compact也能释放,就是慢

请问如何找出哪些表有大量空region,而还未被系统回收的

空region数量在pd的监控那里能看到,但是对应哪些表的应该不好找。

我研究了下,可以这样查询,查到每个表的regions大小合计和数量,除一下就可以判断region平均大小,太小的肯定有未被回收的:
select DB_NAME,TABLE_NAME,sum(APPROXIMATE_SIZE),count(*) from
(
select t.DB_NAME,t.TABLE_NAME,region_id,t.APPROXIMATE_SIZE from information_schema.TIKV_REGION_STATUS t
group by t.DB_NAMe,t.TABLE_NAME,t.IS_INDEX,region_id,t.APPROXIMATE_SIZE
) a
group by DB_NAME,TABLE_NAME
order by 3 desc;

想知道哪个regions一条数据都没:
select * from INFORMATION_SCHEMA.TIKV_REGION_STATUS t
where t.APPROXIMATE_KEYS=0

GC只是在条目上增加删除标识,compact会压缩