你没用limit时候大多数的region结果缓存在tidb这边了,只需要去tikv发送个rpc看region是否发生了变化,如果没有变化,那么你查询涉及到的这个region数据就是准确的,代价仅仅是一个rpc请求。如果某个region数据发生了变化(更新了版本)。那么就需要重新查询这个region的数据。从这个查询缓存率可以看出你只需要重新扫描大约10%的region即可。所以你看到的一个是10亿,一个是1亿,大约相差10倍。
总结一下,造成上面问题的共有三处可以优化
- 修改参数tidb_gc_life_time,目前是8小时,可以修改为10分钟
- 官方bug:https://github.com/tikv/tikv/issues/11217
影响版本
- v5.0.0-v5.0.4
- v5.1.0-v5.1.2
- v5.2.0-v5.2.2
issue: https://github.com/tikv/tikv/issues/11217
TiKV GcKeys task doesn’t work when called with multiple keys (at least in 5.1 but I think for everything)
现象和确认方法
- 部分 scan 相关操作执行慢,集群中有比较多的 UPDATE/DELETE 语句执行
- EXPLAIN ANALYZE 的 scan detail 中显示
key_skipped_count
远远多于total_process_keys
或者 slow log 中key_skipped_count
远远多于total_process_keys
解决方案
- 设置
gc.enable-compaction-filter: false
以关闭 TiKV 的 compaction filter GC,使用旧的 GC 模式进行多版本 GC - 升级到新版本,如上所述选择发行版最新的发布版本
- 去除limit ,走缓存
没用limit时候大多数的region结果缓存在tidb这边了,只需要去tikv发送个rpc看region是否发生了变化,如果没有变化,那么你查询涉及到的这个region数据就是准确的,代价仅仅是一个rpc请求。如果某个region数据发生了变化(更新了版本)。那么就需要重新查询这个region的数据。
1 个赞
加了limit,优化器会按key进行排序。
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。