Count(*) 优化

为提高效率,提问时请尽量提供详细背景信息,问题描述清晰可优先响应。以下信息点请尽量提供:

  • 系统版本 & kernel 版本】 centos7
  • TiDB 版本】 3.0.4
  • 磁盘型号】 1T 的云ssd磁盘
  • 集群节点分布】 2个tidb节点,4个tikv节点,3个pd节点
  • 数据量 & region 数量 & 副本数】 1亿,每个节点1.5k region
  • 问题描述(我做了什么)】 这是一个新部署的测试集群,上面没有其他请求,就是在测试, 4台16C32G 的tikv节点,一张一亿的表,count(id)一下需要5s,集群默认安装

表结构 MySQL [sbtest]> desc sbtest1 ; ±------±----------±-----±-----±--------±---------------+ | Field | Type | Null | Key | Default | Extra | ±------±----------±-----±-----±--------±---------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | k | int(11) | NO | MUL | 0 | | | c | char(120) | NO | | | | | pad | char(60) | NO | | | | ±------±----------±-----±-----±--------±---------------+

  • 关键词】 count(*)

慢查询

Time: 2019-10-25T10:47:50.227020873+08:00

Txn_start_ts: 412082940265889793

User: root@172.21.244.94

Conn_ID: 14892

Query_time: 4.735534417

Parse_time: 0.000135677

Compile_time: 0.000328002

Process_time: 64.186 Wait_time: 0.093 Request_count: 110 Total_keys: 100000110 Process_keys: 100000000

DB: sbtest

Index_names: [sbtest1:k_1]

Is_internal: false

Digest: 1f61de15725a7b1d1caba706b2743946e007f3fa9a29126864060d9de25a1693

Stats: sbtest1:412082675762593797

Num_cop_tasks: 110

Cop_proc_avg: 0.58350909 Cop_proc_p90: 0.837 Cop_proc_max: 1.045 Cop_proc_addr: 172.21.48.216:20160

Cop_wait_avg: 0.000845454 Cop_wait_p90: 0.001 Cop_wait_max: 0.002 Cop_wait_addr: 172.21.48.214:20160

Mem_max: 186

Prepared: false

Has_more_results: false

Succ: true

select count(id) from sbtest1;

trace format='row' select count(id) from sbtest1;

这个结果发下

image

可以看到大量的时间消耗是在 recordset.next 。就是在扫索引,扫索引,也是要完整扫过5亿行,目前还没有做一些比较特殊的优化操作。5s 现在比较正常,后续我们会持续优化索引。

好的,感谢