tidb查询执行计划默认索引选择错误

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

  • 【TiDB 版本】:V3.0.14
  • 【问题描述】:sql执行计划默认使用全表扫描,而没有使用更优的索引,导致请求时间变大

如下截图: aftersale表健康度为98%,Modify_count为227520,Row_count为15384886

sql: SELECT COUNT(*) AS total FROM aftersale WHERE goods_id=‘43222179’ AND type=‘0’ AND mall_id=140990 AND (create_at >= ‘2020-05-11 00:00:00’ and create_at <= ‘2020-08-08 23:59:59’) AND is_bot=0 AND status > 4 LIMIT 1; 执行耗时3秒+

而sql加上索引hint语法后: SELECT COUNT(*) AS total FROM aftersale force index(tidb2rds_mid_create) WHERE goods_id=‘43222179’ AND type=‘0’ AND mall_id=140990 AND (create_at >= ‘2020-05-11 00:00:00’ and create_at <= ‘2020-08-08 23:59:59’) AND is_bot=0 AND status > 4 LIMIT 1; 执行耗时20毫秒左右

这种问题近期出现过几次了 , 每次出现时,整个tidb集群由于该表的全表扫描导致性能抖动很严重 。

帮分析下原因 ,以及解决办法,感谢 ~

  1. 如果执行 analyze table 后,执行计划是否正确?
  2. 如果执行 analyze table 后,执行计划走索引,可以设置定时任务来定期执行 analyze table

执行 analyze table 后,执行计划选择的索引是正确的。

设置定时任务来定期执行 analyze table ? 指的是在tidb外部,比如crontab 来定期执行吗 ? tidb内部有什么参数或者功能来支持吗 ?

谢谢

  1. 是的,可以考虑使用外部的类似 crontab 来执行
  2. 可以尝试 SPM https://docs.pingcap.com/zh/tidb/stable/sql-plan-management#执行计划管理-spm
1 个赞

多谢确认。 执行计划不准确的时候,应该是整个表的统计信息都有问题,该表的所有查询都会受到影响 ,使用SPM的话 ,那会需要创建很多个binding ,这个成本有点高了 。

请问3.1或者4.0版本的tidb有解决这个查询执行计划问题的方法吗?

如果tidb集群中表比较少的话,可以通过crontab等外部介入的方式来避免执行执行计划错误,但在表特别多的时候, 这个crontab管理就不太人性化和灵活了 。 麻烦帮确认下

如果变化的表不是很多,可以考虑把ratio的值调小一些,让表自动收集信息。

好的 了解了 多谢

:call_me_hand:,可以看下https://docs.pingcap.com/zh/tidb/stable/statistics#统计信息简介

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。