8000w的表不加order where条件limit 1要20多秒

【 TiDB 使用环境】Poc
【 TiDB 版本】V8.1
【复现路径】对应的表加过ttl
【遇到的问题:问题现象及影响】
sql select * from table_name limit 1
执行计划

| id                    | estRows | estCost | actRows | task      | access object             | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                          | operator info     | memory    | disk  |
| Limit_7               | 1.00    | 67.35   | 0       | root      |                           | time:29.4s, loops:1                                                                                                                                                                                                                                                                                                                                                                                                                                     | offset:0, count:1 | N/A       | N/A   |
| └─TableReader_11      | 1.00    | 67.35   | 0       | root      |                           | time:29.4s, loops:1, cop_task: {num: 794, max: 472.2ms, min: 485.7µs, avg: 36.8ms, p95: 231.7ms, tot_proc: 28.5s, tot_wait: 251.7ms, copr_cache_hit_ratio: 0.78, build_task_duration: 705.1ms, max_distsql_concurrency: 1}, rpc_info:{Cop:{num_rpc:794, total_time:29.2s}}                                                                                                                                                                              | data:Limit_10     | 339 Bytes | N/A   |
|   └─Limit_10          | 1.00    | 305.49  | 0       | cop[tikv] |                           | tikv_task:{proc max:471ms, min:0s, avg: 114ms, p80:147ms, p95:260ms, iters:794, tasks:794}, scan_detail: {total_keys: 86977944, get_snapshot_time: 230.8ms, rocksdb: {delete_skipped_count: 6326304, key_skipped_count: 93304074, block: {cache_hit_count: 2379, read_count: 150700, read_byte: 1.03 GB, read_time: 4.27s}}}, time_detail: {total_process_time: 28.5s, total_wait_time: 251.7ms, total_kv_read_wall_time: 28.4s, tikv_wall_time: 28.9s} | offset:0, count:1 | N/A       | N/A   |
|     └─TableFullScan_9 | 1.00    | 305.49  | 0       | cop[tikv] | table:data_event_relation | tikv_task:{proc max:471ms, min:0s, avg: 114ms, p80:147ms, p95:260ms, iters:794, tasks:794}                                                                                                                                                                                                                                                                                                                                                              | keep order:false  | N/A       | N/A   |

【资源配置】
内存cpu充足

delete_skipped_count: 6326304, key_skipped_count: 93304074
read_byte: 1.03 GB, read_time: 4.27s

删除数据太多,很多没gc或者没compact

1 个赞

task 也很多,说明表很大,但主要是 mvcc 版本太多的原因。可以看下 gc 有没有推进,或者短时间内删改的数据太多了

1 个赞

我该怎么解决呢

8.1还有这个问题呀,我们5.x都快愁死了 :joy: :joy: :joy:

1 个赞

设置下gc的配置周期呢? tidb_gc_life_time=10m0s

赶紧升级 :joy:

1 个赞

MVCC 版本过多问题

加上 limit 1 时自动算子并行度变为 1 了,导致整个执行很慢

检查下 GC 情况是否正常,检查下业务逻辑,是否 DELETE 大量数据

select count(*) 查下条数,
再查下key数量
select sum(t.APPROXIMATE_KEYS)
from INFORMATION_SCHEMA.TIKV_REGION_STATUS t
where t.TABLE_NAME=‘’
and t.DB_NAME=‘’

看看grafana里TiDB—>GC里面指标有没有异常的

还有大佬专门验证过

2 个赞

这不升级也解决不了嘛

这个问题表大了数据多了,升级也解决不了,最好就是控制表的数据量

1 个赞

select * from table_name where id=1
反正也是查一行 改成这样不就快了

补充一些日志

那确实可以

已经调整,今天这个问题还在

看日志是说TTL任务超限制了

  • 调整tidb_ttl_delete_batch_sizetidb_ttl_scan_batch_size:这些参数控制TTL任务的批量大小。通过减小这些值,可以减少每次任务处理的数据量,从而降低任务数量。
  • 调整tidb_ttl_delete_worker_counttidb_ttl_scan_worker_count:这些参数控制执行TTL任务的工作线程数。适当增加这些值可以提高任务的处理速度。
    这个可以参考一下
1 个赞