【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】6.5
【复现路径】
【遇到的问题:问题现象及影响】没有安装 tiflash, 10亿数据量的表做select count(1) from 很慢,请问下这是正常现象吗?有什么解决方案?
【资源配置】
【附件:截图/日志/监控】
看下tikv资源使用情况。
表有主键么?完整语句里有order by等条件么?
count(1) 如果没索引就全表了,count(*) 会走主键索引等
这俩有区别么?感觉实际使用中count(1)和count(*) 效果差不多 ,但我司内部一直认为count(1)比count(*) 效率高。
表有联合主键,没有任何条件。select count(*) from d_secondminutedata;
执行这个语句看看执行计划
explain analyze select count(*) from d_secondminutedata;
实践派大佬
你的资源配置什么样,磁盘什么类型。10亿条 47秒也还可以吧
6个kv节点,每台机器都是16核,16g内存。47秒是第二次执行的结果,第一次执行差不多接近200秒
磁盘呢什么类型,上面的explain analyze的结果上传下 截图有些新看不到
把slow log 中这条语句相关的信息上传一下。
explain analyze 看看
10 亿数据,如果 tikv 不是很忙的话,cpu 足够多还是可以的差不多几秒钟就能 count 完🤔。
tidb多大的配置
tidb好像在parser层就把count(1)和count(*)划等号了。
看我这个,好慢。。。
mysql> explain analyze select /*+ read_from_storage(tikv[lineitem]) */ count(*) from lineitem;
+----------------------------+-------------+----------+-----------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------+-----------+------+
| id | estRows | actRows | task | access object | execution info | operator info | memory | disk |
+----------------------------+-------------+----------+-----------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------+-----------+------+
| HashAgg_13 | 1.00 | 1 | root | | time:39.4s, loops:2, partial_worker:{wall_time:39.362488482s, concurrency:5, task_num:1, tot_wait:3m16.81108575s, tot_exec:94.27µs, tot_time:3m16.811192801s, max:39.362249552s, p95:39.362249552s}, final_worker:{wall_time:0s, concurrency:5, task_num:1, tot_wait:3m16.811393418s, tot_exec:30.083µs, tot_time:3m16.811426486s, max:39.362296841s, p95:39.362296841s} | funcs:count(Column#18)->Column#17 | 16.5 KB | N/A |
| └─TableReader_14 | 1.00 | 156 | root | | time:39.4s, loops:2, cop_task: {num: 159, max: 7.69s, min: 212.8ms, avg: 3.54s, p95: 7.15s, max_proc_keys: 462798, p95_proc_keys: 462756, tot_proc: 8m47.6s, tot_wait: 33.5s, rpc_num: 159, rpc_time: 9m23.4s, copr_cache_hit_ratio: 0.00, build_task_duration: 274.2µs, max_distsql_concurrency: 15}, backoff{regionMiss: 2ms} | data:HashAgg_6 | 438 Bytes | N/A |
| └─HashAgg_6 | 1.00 | 156 | cop[tikv] | | tikv_task:{proc max:7.2s, min:212ms, avg: 3.32s, p80:5.75s, p95:6.83s, iters:70417, tasks:159}, scan_detail: {total_process_keys: 72080384, total_process_keys_size: 2594893824, total_keys: 73692884, get_snapshot_time: 16.4s, rocksdb: {delete_skipped_count: 130912, key_skipped_count: 73762895, block: {cache_hit_count: 2208, read_count: 455143, read_byte: 4.43 GB, read_time: 5.11s}}} | funcs:count(1)->Column#18 | N/A | N/A |
| └─TableFullScan_12 | 70899712.00 | 72080384 | cop[tikv] | table:lineitem | tikv_task:{proc max:7.2s, min:211ms, avg: 3.32s, p80:5.75s, p95:6.83s, iters:70417, tasks:159} | keep order:false | N/A | N/A |
+----------------------------+-------------+----------+-----------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------+-----------+------+
4 rows in set (39.36 sec)
主要慢的点:
1、copr_cache_hit_ratio=0,没有命中tidb侧的缓存。
2、get_snapshot_time: 16.4s,不知道为啥这么慢。。。
3、read_byte: 4.43 GB, read_time: 5.11s,发生了物理读。
4、tablescan慢,我理解的是:time:39.4s - get_snapshot_time: 16.4s - read_time: 5.11s = 17.89s
17.89s * 15 / tasks:159 = 1.69s,纯内存读取数据一个region平均花费1.69秒,感觉好慢。。
当时在加载并发加载数据,应该是CPU不足导致。但是get_snapshot_time为何这么慢啊?
有时候15个task一起干活才勉强干得过传统数据库一个干活的。感觉tikv的数据读取扫描效率不高啊。