连表查询,TiDB需要30多秒,在mysql只需要0.5秒,麻烦帮忙看下原因。

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.3
  • 【问题描述】:执行一个连表查询,需要30多秒,在mysql只需要0.5秒,麻烦帮忙看下原因。

sqlan.txt (19.1 KB)
sql (3.5 KB)

mysql 和 tidb 中各表的数据量有没有较大差异,如果两边数据量基本一致,麻烦提供下关联10张表的 schema 信息,以及 tidb 的 stats 统计信息。

查看 schema 表结构
show create table ... > table_name.sql
导出统计信息
curl -G "http://${tidb-server-ip}:${tidb-server-status-port}/stats/dump/${db_name}/${table_name}" > table_name_stats.json

作为对比,方便的话也请提供下 mysql 的 json 格式执行计划
explain format = json select...

slowsql.tar.gz (1.9 MB)

可以尝试加 hint,指定走表关联方式为 Index Join

SELECT /*+ INL_JOIN(d, m, taskd, taskm, o, expend1, expend2, p, l, pl, LEVEL) */ ...

不管用

跟原执行计划比有没有改善,请反馈下加 hint 后 explain 和 explain analyze 结果,如果使用 mysql 客户端,需要在启动客户端时加上 --comments 选项,例如 mysql -h 127.0.0.1 -P 4000 -uroot --comments

还可以查看表的统计信息健康度 show stats_healthy,对健康度小于 80 的表 analyze table table_name 先收集统计信息,然后 explain analyze 看有没有改善

show stats_healthy,有好几张表是0的,全部analyze table 以后,都到了100,个别的是90的。然后执行explain analyze ,没有改善。explain2.sql (19.5 KB)

  1. 能否麻烦您反馈 mysql 中这个语句的 执行计划,我们对比下是否相同,多谢。
  2. 请问 mysql 和 tidb 中的数据量分别是多少? 多谢。

1:
mysql执行计划 (4.8 KB)
2:数据量一样,目的是对比测试,决定是否迁移到tidb

确认一下问题,多执行几次,是每次都 30s,还是首次执行时慢?

每次都是大于30秒

test.sql (2.0 KB)

这 2 个 sql 执行下,拿下结果,谢谢

test.sql (15.1 KB)

@zgcbj

  1. 我给上面 2 个 sql 加了个 hint 固定下执行计划
    test.sql (2.0 KB)
  2. 麻烦分别执行 2 个 sql 的同时,再各拿下这个信息吧
    curl http://{TiDBIP}:10080/debug/zip?seconds=20 --output debug.zip

debug.zip (1.0 MB) debug2.zip (1.0 MB) test (1).sql (49.2 KB)

我又改了一下 sql,麻烦再跑一下这个试试吧,谢谢

test.sql (1.0 KB)

test (2).sql (6.4 KB)
这个很快,只用了0.12秒

那可能就是这个的问题了,有张表走错了索引

我改下完整的 sql 再发你试下