SQL 执行时间过长

【问题】
表中只有7条数据,执行时间超过2s:

执行计算:
id task estRows operator info actRows execution info memory disk
TableReader_7 root 8000 data:Selection_6 4 time:19.844061ms, loops:2, cop_task: {num: 1, max:17.091369ms, proc_keys: 7, rpc_num: 2, rpc_time: 16.980702ms, copr_cache_hit_ratio: 0.00} 485 Bytes N/A
└─Selection_6 cop[tikv] 8000 or(or(or(eq(mqtt.mqtt_acl.ipaddr, “192.168.248.16”), eq(mqtt.mqtt_acl.username, “xzzh”)), eq(mqtt.mqtt_acl.username, “$all”)), eq(mqtt.mqtt_acl.clientid, “011_1_0000_19216824816”)) 4 time:0s, loops:1 N/A N/A
└─TableScan_5 cop[tikv] 10000 table:mqtt_acl, range:[0,+inf], keep order:false, stats:pseudo 7 time:0s, loops:1 N/A N/A

这种问题,该如何分析时间消耗在哪里呢?

1 个赞

表只有7条数据,estRows显示10000,执行下 ANALYZE TABLE tablename,再看看执行计划

分析信息中有提示 stats:pseudo,请先进行analyze提高表健康度

详见官方链接
https://docs.pingcap.com/zh/tidb/stable/identify-slow-queries#搜索统计信息为-pseudo-的慢查询-sql-语句

执行的analyze的时间太长了吧

执行时间超过10分钟还没有完,就取消了

确定表里只有7条数据么?这analyze的时长不应该啊,监控一下tidb集群的当前状态是否正常

表中数据只有7条,判断状态是否正常需要查看那些监控指标?


这种一直是run状态的怎么终端结束呢?

这是在哪里查询的内容?

通过 “SHOW ANALYZE STATUS ;” 查询到的。

show full processlist看看进程情况

在确认不进行analyze的情况下,可以将analyze的进程,通过 kill tidb 进程id 的方式终止。

在kill以后,SHOW ANALYZE STATUS 查询结果还是一样的:

那show full processlist里还能查到么?Grafana监控里的服务器IO、内存、CPU使用情况如何?

执行 show full processlist 是查询不到了

ANALYZE 一个 7条数据的表,需要不了多少资源吧

对啊,所以才奇怪你那边怎么那么慢,是正式生产环境么?是不是网络不好,导致查询分析器一直等待啊

是正式环境,网络是在正常的,执行普通的SQL语句,都没这么长时间。除了网络,还会有什么原因导致分析器一直是run状态呢?

有没有什么办法中断呢?