Select 2千万行数据查询时间需要30s以上

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

  • 系统版本 & kernel 版本: CentOS Linux release 7.5.1804 (Core)
  • TiDB 版本:
  • 磁盘型号:SAS
  • 集群节点分布:PD3台,tidb2台,tikv3台
  • 数据量 & region 数量 & 副本数:默认未动
  • 集群 QPS、.999-Duration、读写比例:未知
  • 问题描述(我做了什么):

SELECT ac,dtime,ranges from data_detail where mmc in (‘1422’,‘1fdf’,‘14de’,‘ed1b’,‘ecd9’,‘6292’,‘ecef’)

使用 trace 以及 explain 看下执行计划。打开慢日志,分析下慢日志。另外,TiDB 对磁盘要求比较高,不建议用 SAS 来做性能测试。

Time: 2019-09-24T16:10:17.321454862+08:00

Txn_start_ts: 411385886596923393

Query_time: 0.614628338

Wait_time: 0.104 Request_count: 2 Total_keys: 17 Process_keys: 16

Index_names: [stats_meta:idx_ver]

Is_internal: true

Digest: f0b4536b9ca2b2cf8b0b4580fa5a6804ace888b4601ce93f17b17f18409e96f0

Stats: stats_meta:pseudo

Num_cop_tasks: 2

Cop_proc_avg: 0 Cop_proc_p90: 0 Cop_proc_max: 0 Cop_proc_addr: 192.168.0.31:20160

Cop_wait_avg: 0.052 Cop_wait_p90: 0.102 Cop_wait_max: 0.102 Cop_wait_addr: 192.168.0.31:20160

Mem_max: 10212

Succ: true

SELECT version, table_id, modify_count, count from mysql.stats_meta where version > 411385154468052996 order by version;

Time: 2019-09-24T16:10:18.517595174+08:00

Txn_start_ts: 411385886754209793

Query_time: 1.195963837

Wait_time: 0.021 Request_count: 2 Total_keys: 20 Process_keys: 18

Index_names: [stats_histograms:tbl]

Is_internal: true

Digest: ff1ba2b3cf4f7452291642f6399447979825a310ef25a78f01288580f398a3c9

Stats: stats_histograms:pseudo

Num_cop_tasks: 2

Cop_proc_avg: 0 Cop_proc_p90: 0 Cop_proc_max: 0 Cop_proc_addr: 192.168.0.31:20160

Cop_wait_avg: 0.0105 Cop_wait_p90: 0.021 Cop_wait_max: 0.021 Cop_wait_addr: 192.168.0.31:20160

Mem_max: 12552

Succ: true

select table_id, is_index, hist_id, distinct_count, version, null_count, tot_col_size, stats_ver, flag, correlation, last_analyze_pos from mysql.stats_histograms where table_id = 63;

Time: 2019-09-24T16:10:37.029328241+08:00

Txn_start_ts: 411385885902241800

User: root@192.168.0.10

Conn_ID: 246

Query_time: 22.925780025

Process_time: 105.881 Wait_time: 198.545 Request_count: 128 Total_keys: 18240036 Process_keys: 18239352

DB: bgd

Is_internal: false

Digest: 0468a7dad635950a1c41f0851ede5a90a13245dba4d16fde6f9b5ea6ef886f8d

Stats: data_detail_20190711:411384531142049794

Num_cop_tasks: 128

Cop_proc_avg: 0.827195312 Cop_proc_p90: 1.179 Cop_proc_max: 1.669 Cop_proc_addr: 192.168.0.30:20160

Cop_wait_avg: 1.551132812 Cop_wait_p90: 3.305 Cop_wait_max: 3.959 Cop_wait_addr: 192.168.0.30:20160

Mem_max: 245067004

Succ: true

给出的这两条慢日志信息不是应用的查询 SQL,是系统内部的查询,确定这是人为触发需要查询的 SQL 信息吗?

是的,是做的select查询,日志里面有这个命令,只是没贴上去

SAS 硬盘不建议在生产环境使用,或者进行性能测试。

不太明白什么意思,看描述说是 select 2千万行数据需要 30 s 以上,所以需要提供下这条 select 语句的相关信息(包含这条查询语句的慢日志信息,语句的执行计划以及表结构),看给出的慢日志信息里面的查询也是内部 SQL 语句,没有办法分析,另外如果是线上环境,磁盘性能也达不到官方部署要求。

现在就是测试这个是否能达到查询速度提升的问题,如果能提升线上会使用SSD硬盘,默认就算是集群查询速度也是单台速度一样吗

SELECT ac,dtime,ranges from data_detail where mmc in(‘1422’,‘1fdf’,‘14de’,‘ed1b’,‘ecd9’,‘6292’,‘ecef’)

Time: 2019-09-25T11:34:24.322569477+08:00

Txn_start_ts: 411404196447518722

Query_time: 1.036637683

Wait_time: 0.008 Request_count: 2 Total_keys: 22 Process_keys: 18

Index_names: [stats_histograms:tbl]

Is_internal: true

Digest: ff1ba2b3cf4f7452291642f6399447979825a310ef25a78f01288580f398a3c9

Stats: stats_histograms:pseudo

Num_cop_tasks: 2

Cop_proc_avg: 0 Cop_proc_p90: 0 Cop_proc_max: 0 Cop_proc_addr: 192.168.0.32:20160

Cop_wait_avg: 0.004 Cop_wait_p90: 0.007 Cop_wait_max: 0.007 Cop_wait_addr: 192.168.0.32:20160

Mem_max: 12552

Succ: true

select table_id, is_index, hist_id, distinct_count, version, null_count, tot_col_size, stats_ver, flag, correlation, last_analyze_pos from mysql.stats_histograms where table_id = 137;

Time: 2019-09-25T11:34:42.699267448+08:00

Txn_start_ts: 411404196028088326

User: root@192.168.0.10

Conn_ID: 2189

Query_time: 21.007112059

Process_time: 103.53 Wait_time: 253.523 Request_count: 128 Total_keys: 18240036 Process_keys: 18239352

DB: bgd

Is_internal: false

Digest: 0468a7dad635950a1c41f0851ede5a90a13245dba4d16fde6f9b5ea6ef886f8d

Stats: data_detail_20190711:411384531142049794

Num_cop_tasks: 128

Cop_proc_avg: 0.808828125 Cop_proc_p90: 1.2730000000000001 Cop_proc_max: 2.245 Cop_proc_addr: 192.168.0.30:20160

Cop_wait_avg: 1.9806484370000002 Cop_wait_p90: 3.767 Cop_wait_max: 4.753 Cop_wait_addr: 192.168.0.30:20160

Mem_max: 241229801

Succ: true

SELECT ac,dtime,ranges from data_detail where mmc in(‘1422’,‘1fdf’,‘14de’,‘ed1b’,‘ecd9’,‘6292’,‘ecef’);

看下上一条的回复吧,提供下必要的信息方便分析。

慢日志信息不就是tidb_slow_query.log里面的信息吗

集群版本,语句的执行计划以及表结构也提供下,另外可以先检查下这张表的统计信息是不是很久没有更新了,也跟 SAS 盘的性能有关系。

集群版本:不知道哪里查看,最近今天才到你们官网安装的, 集群节点分布:PD3台,tidb2台,tikv3台 表结构

手动执行语句:SELECT ac,dtime,ranges from data_detail where mmc in(‘1422’,‘1fdf’,‘14de’,‘ed1b’,‘ecd9’,‘6292’,‘ecef’); 这个表是7月份的,是没有更新

先根据官网文档看下一些基础的知识点,另外提供下我上面提到的执行计划、表结构以及版本信息,具体怎么查看官网有介绍,只是单纯的给一条语句,不好分析解决问题。另外,请看下我们的提问须知, 按照模版提问解决问题会更高效。