select * from T limit 1 执行很久

那可能不是gc没推进,而是你需要被gc的数据一直都很多啊。。。

建新表只能临时解决一段时间吧,再跑一段时间,不是又不行了。

看下执行计划,是卡在哪个地方,理论应该是下推取一行的

process_key跟total_key相差很大,历史版本太多了

1 个赞


我这看着还凑合

你这是查指定字段,用select * limit 1 试试呀
SELECT * FROM table LIMIT 1;

image
select * 也凑合

这是我统计信息

我最近也在反复测试gc和compact,自动compact相当保守,一天也compact不了多少key ,手工compact效果不错,但是系统负载很高,非常消耗资源。
从官方手册分析,有这几个参数可能有用,我还没验证


image
image

你把表里的数据全部delete再查就很慢了

按照正常的算法,数据库在查找此表数据时,查找到任何一条数据就会立即返回结果,所以不应该慢。

简单说,一个表假设10亿个key(tidb按 key排序存储),第一行可以返回的数据在第5亿行,找到这行数据就要读5亿条数据,所以很慢

有个简单的测试,建个自增表,插入1亿条数据,删除前99999999条数据只留最后一条,然后select * from X limit 1,会扫描全部数据

这种场景,在生产上很常见,增删频率很高的表都有这种可能性存在

这表DML语句频繁吗?

1 个赞

一直在update

是的,而且目前我测试过,靠compact删除数据是非常非常慢的,把1亿条数据delete,会变成2亿个key,过一天也少不了一半

update语句执行速度快吗?

带条件,有主键或索引,速度应该很快。

走主键或索引可以定位数据在region里面位置,扫描的key数量数量会少

是的,这种情况很快