【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】6.5.3
【复现路径】做过哪些操作出现的问题
1.使用tikv golang的客户端v2.0.7往tikv集群写入数千万级别的kv键值对
2.删除全部的key
3.使用带事务的Iter接口扫描一个特定范围的key,startKey= ff7969676f5c746573745c ,endKey = ff7969676f5c746573745cff
【遇到的问题:问题现象及影响】
1.扫描过程中发现耗时很长,耗时总计快1分钟
2.通过在tikv客户端加入打印发现,iter接口前后向1300多个region发送过getData方法,但是都没有扫描到匹配的key,这一点符合预期,因为都被删除掉了
3.问题是这些region没有触发合并,在什么条件下才会合并?是不是需要在pd上做某些配置呢?
比较吊诡的是,当我使用pd_ctl工具查询start/end key所处的的region的时候,只返回了一个region
这又与上面从1300多个region访问的事实不符,到底是哪出了问题?
请大佬解惑
===============================
更新一下这个问题的进展,首先我使用golang客户端的gc的example跑了一下gc,简单测试了一下,问题还在,也就是scan的时候,仍然会去1300多个region挨个扫描,但是扫不到东西。
取其中的一个region为例7979980,如下图
使用pd工具可以查到7979980这个region里面也是有key的,如下图所示,空间95MB,204800个key
再看一下region里面的mvcc的key的数量
我一开始想不通为什么里面明明有key存在,但是扫出来的数量为0,看到2楼的解释说,即使做了gc,mvcc里面也会有一个tombstone的版本的key存在,那我猜测现在region里面存的key会不会就是墓碑版本的key呢?如果是的话,什么操作才可以彻底删除这些墓碑的key,进而触发region合并且减少region的数量呢?