TIDB不同版本同表同SQL的查询速率差异

【 TiDB 使用环境】
V 5.2.1 和 V4.0.15

【概述】 场景 + 问题概述
同一张表,使用相同SQL explain的查询速率差异巨大
explain及SQL 如下:
dish_analysis_result.sql (1.9 KB)
long_text_2021-10-29-10-27-03.txt (109.5 KB)

explain执行结果:
v4.0.15的结果
v4.0.15 (203.6 KB)
v5.2.1的结果
v5.2.1 (204.1 KB)

【背景】 做过哪些操作
2个TIDB的硬件配置相同 系统配置相同 TIDB配置基本都是默认配置

1 个赞

2个库上的表数据一致吗?
v4:
└─HashAgg_16(Probe) 1.00 182601 cop[tikv] time:34.4s
v5:
└─HashAgg_17(Probe) 1.00 352903 cop[tikv] time:1m6.4s,
actRows差一倍了

3 个赞

2个表数据一致
数据是从5.2.1 同步到4.0.15的

2 个赞

└─IndexLookUp_33 1.00 182601 root
scan_detail: {total_process_keys: 144213, total_keys: 145142}

└─IndexLookUp_38 1.00 352903 root
scan_detail: {total_process_keys: 490941, total_keys: 493644
实际扫描的数据有差异

2 个赞

select count 结果 2个库的表行数是一样的

1 个赞

两边集群负载情况也是完全相同?一般数据同步的上游压力会比下游更大,SQL 性能出现差异也很正常。

1 个赞

观察下来 2个集群负载差不多

1 个赞

这条 SQL 每次查询都出现这种情况吗?如果是的话,可以分别把两个集群中表的统计信息、表结构和 SQL 提供下,我们尝试做下本地复现,表统计信息导出方式参考:
https://docs.pingcap.com/zh/tidb/v4.0/statistics#导出统计信息

1 个赞

之前每次查询都是这种情况
我把tidb 5.2.1升级到5.2.2后,explain速度快了很多 但是很4.0.15比 还是慢了一倍
2个tidb集群的统计信息、表结构和 SQL 见如下:
tidb_error.zip (1.2 MB)

1 个赞

牛蛙牛蛙

v5.2.2 的优化器确实改进了,不过你的这个问题,建议考虑一下hint,使用索引 让使用 dish_data_brand 这个索引试试。

感谢 我们先尝试下

:ok_hand:,如果有效果记得反馈一下吧,这里没有选择合适索引,感觉怪怪的(你的表统计信息建议检查一下)

5.2.2使用了 dish_data_brand 这个索引后,耗时6秒 比原先快了2秒
但是4.0.15 基本无变换,在2~3秒
2个版本之间的查询差距还是1倍以上

1 个赞

您好,其实今天这个问题是接着这个帖子https://asktug.com/t/topic/95198/30继续发问的,当时我们线上升级到5.2.1以后发现系统出现大量的慢查询导致OOM,迫不得已回滚到了4.0.15版本,目前线上4.0.15正常。现在是想在测试环境验证两个环境之间的差异,然后重新进行升级,目前看起来5.2.2版本对比5.2.1版本确实在慢sql方面优化了不少,但是对比4.0.15版本还是有一倍以上的性能差距,就感觉很怪,升了级反而变慢了:sweat_smile::sweat_smile::sweat_smile:

额,你上面提供的执行计划是看时间是 1分钟多啊,为啥是 2-3秒,6秒之类的。帮确认一下?或者你提供一下,执行 2-3秒或 6秒时候的执行计划?

不指定索引:
5.2.2版本:


4.0.15版本:

使用hint指定dish_data_brand索引:
5.2.2版本:

4.0.15版本:

方便,再开启这个参数 看看执行结果嘛(:joy:第一次看 SQL 以为就一个 in,现在发现少看了一个条件)参数: tidb_enable_index_merge(开启 session 级别的就行)

不过关于 v5 和 v4 版本的,看执行计划,确实有点疑惑,我需要确认一下(能否提供给我2个版本的 explain analyze 的 文本结果:上面的是图,我需要看 execution info 的信息,后面的少了一些,看起来不方便)

另外,如果咱们有环境测试的话,建议关注一下这几个参数: tidb_index_lookup_sizetidb_index_serial_scan_concurrencytidb_executor_concurrency(建议根据业务特点来设置)