tidb 的增删改查最终反映到tikv是对一个key的处理。
在key中增加了时间戳后缀,实现了mvcc。
tidb的gc就是删掉过期的版本。
也就是说一条数据可能存在 key1_ver1 key1_ver2 key1_ver3 等好几个版本,等key1_ver1 过了gc时间了,没有事务在用了。就要删掉。这就是gc干的活。
tikv底层用的rocksdb。
也就是说上面的 删除key,就是 一条 delete(key1_ver1)
gc到此就结束了。
至于compact,就要从rocksdb的 lsmtree 理解了。
对于rocksdb来说,所有的修改只是追加。比如说上面的操作反应到rocksdb就是做了几条记录:
deletekey(key1_ver1)
putkey(key1_ver3)
putkey(key1_ver2 )
putkey(key1_ver1)
从下到上,时间按从老到新。
这样其实对于 key1_ver1 在rocksdb中就属于浪费的key,读不到了。这样删除的key多了以后,就会浪费很多磁盘空间。所以就有了compact
执行compact后,数据就变成了
putkey(key1_ver3)
putkey(key1_ver2)
磁盘空间就减少了。