tidb并发查询慢

【 TiDB 使用环境】生产环境 /测试/ PCO
【 TiDB 版本】5.7.25-TiDB-v6.1.0
【遇到的问题】
sql语句:
select
T_58CD4F.branch_name as __fcol_0,
sum(T_58CD4F.number) as __fcol_1
from (SELECT
DISTINCT
d.lines_name,
d.branch_name,
d.shop_name,
di.delivery_id,
di.sku,
di.number
from (
SELECT
d.delivery_id,
d.lines_name,
b.name AS branch_name,
s.name AS shop_name,
d.erpsource
FROM
erp_sdb_wms_delivery d
LEFT JOIN erp_sdb_ome_branch b ON b.branch_id = d.branch_id AND b.erpsource = d.erpsource
LEFT JOIN erp_sdb_ome_shop s ON s.shop_id = d.shop_id AND s.erpsource = d.erpsource
WHERE
delivery_time BETWEEN UNIX_TIMESTAMP(‘2021-01-01’) and UNIX_TIMESTAMP(DATE_ADD(‘2022-08-01’,INTERVAL 1 DAY ))

    ) d join ( SELECT delivery_id, bn AS sku, erpsource, number FROM erp_sdb_wms_delivery_items
 WHERE 1=1
 and bn in ('SOUFEEL_22','BZD008') ) di
      ON di.delivery_id = d.delivery_id and di.erpsource=d.erpsource

) as T_58CD4F
where 1 = 1
group by T_58CD4F.branch_name
【问题现象及影响】
单独执行耗时是7.3秒,但是多个并发执行这个sql的时候耗时达到32秒。
观察dashboard页面,cpu使用率变高


请教这种面对多个并发执行的时候,该如何提高查询性能

慢日志信息:

Time: 2022-09-07T11:50:36.185994767+08:00

Txn_start_ts: 435820324708679681

User@Host: root[root] @ 125.211.72.217 [125.211.72.217]

Conn_ID: 3894492175815148323

Query_time: 35.214570341

Parse_time: 0.000344403

Compile_time: 0.003411279

Rewrite_time: 0.001141417

Optimize_time: 0.001980015

Wait_TS: 0.0000225

Cop_time: 176.960387282 Process_time: 415.196 Wait_time: 269.759 Request_count: 2527 Process_keys: 4548617 Total_keys: 6660728 Rocksdb_delete_skipped_count: 932 Rocksdb_key_skipped_count: 5938109 Rocksdb_block_cache_hit_count: 30499722

DB: bdata

Index_names: [erp_sdb_wms_delivery:ind_delivery_time,erp_sdb_wms_delivery_items:ind_bn_status_code]

Is_internal: false

Digest: 3c42814a7dd1f443ae3da83f3924bc91f62b04865bacd82f2f3438be6f3c09c6

Stats: erp_sdb_wms_delivery:435525279461408769,erp_sdb_ome_branch:pseudo,erp_sdb_wms_delivery_items:435803349122547715,erp_sdb_ome_shop:pseudo

Num_cop_tasks: 2527

Cop_proc_avg: 0.164303917 Cop_proc_p90: 0.607 Cop_proc_max: 2.341 Cop_proc_addr: 172.0.0.239:20160

Cop_wait_avg: 0.106750692 Cop_wait_p90: 0.221 Cop_wait_max: 0.443 Cop_wait_addr: 172.0.0.239:20160

Mem_max: 63699047

Prepared: false

Plan_from_cache: false

Plan_from_binding: false

Has_more_results: false

KV_total: 699.761262391

PD_total: 0.000010866

Backoff_total: 0

Write_sql_response_total: 0.000005886

Result_rows: 3

Succ: true

IsExplicitTxn: false

并发时 主要慢在什么地方?

并发时 每个机器的 cpu IO 网络流量 高不高?

只有cpu高,目前tidb用的是单节点

cpu 高时 tidb 高 还是kv 的高呀?

这个在哪里查看呢,我只找到了整体的cpu图表

Query_time: 35.214570341
Cop_time: 176.960387282
Process_time: 415.196
Wait_time: 269.759
Request_count: 2527
Process_keys: 4548617
Total_keys: 6660728
Rocksdb_delete_skipped_count: 932
Rocksdb_key_skipped_count: 5938109
Rocksdb_block_cache_hit_count: 30499722

查询总共花了35秒,你想优化这条 SQL,还是寻找导致 tidb 慢的原因?

  1. 优化SQL的话,就需要通过 explain sql 来看执行计划,进行优化

  2. 看以上的记录信息,慢应该是在 tikv 节点;你可以开启 问题定位的方式,来获取 慢 SQL 的信息

  3. 通过 prometheus 观察 集群中tikv 节点的资源执行情况,相同时间点是否也有 高 cpu,高IO ,高内存的情况

资源定位:
https://docs.pingcap.com/zh/tidb/stable/identify-expensive-queries

1 个赞

单条sql执行速度正常,但是有多个客户端同时执行这条sql速度就会成倍数的变长,有什么方法解决这个问题吗

会变得多慢?

如果数据量相等的情况下,变更结构会让这个过程更稳定一些么?

优化有很多方向的

如果只是并发量大时执行慢,应该是资源不足引发等待导致的,可进一步定位是哪种资源(CPU、IO、内存),同时也需要参考执行计划优化SQL

根据并发的增加,成指数增长,比如只执行一条sql耗时12秒,两个sql并发执行耗时16秒,七条并发的时候耗时46秒

[quote=“alfred, post:9, topic:933046”]
资源

什么配置,多大量?

一个节点,混布? :joy:

嗯,一个节点,但不应该这么慢啊,只是同时执行了几条sql,查询速度就急速下降了

你在多弄点资源吧…
完全不按官方文档上的要求来,还说慢… 太会玩了…

单台不行吗?这个是测试环境,对了,sql查询的主表是百万级数据,子表是千万级数据,数据量也不是特别大啊

没啥意义 :custard:

公司预算没那么高:nauseated_face: 单台节点没办法玩转吗:cold_sweat: 能抗住几十个并发就行啊

他就1台机器,混部了1TiDB、1PD、1TiKV,这还得亏没用上TiFlash,否则可能还要再布个TiFlash。:sweat_smile: