统计信息
产生慢语句有很多种原因最常见的是,因为执行计划不准确导致的执行计划选错,或本身因为代码设计限制导致选错了执行计划下面分别说明
原因
统计信息的收集默认是自动进行的。自动收集需要满足两类条件
新表行数达到 1000,且 1 分钟内没有更新
表的(修改数/当前总行数)大于 tidb_auto_analyze_ratio 默认是 0.5 的时候,并且当前时间在 tidb_auto_analyze_start_time、tidb_auto_analyze_end_time 时间范围内(Time 时间使用的 UTC时间)会自动触发 analyze 语句
当表更新量很大或者表本身很大,还并为达到 auto analyze 的阈值,很有可能导致统计信息不准确的,从而执行优化器制定了错误的执行计划。导致慢语句的产生
问题定位
通过如下命令查询表的健康度,一般如果健康度低于 70%就建议进行手动的统计信息收集。通过如下命令可以快速查看对应表的健康度
SHOW STATS_HEALTHY [ShowLikeOrWhere];
通过如下命令查询表统计信息源数据,当 modify_count >= row_count 时,健康度为 0;当 modify_count < row_count 时,健康度为 (1 - modify_count/row_count) * 100
SHOW STATS_META [ShowLikeOrWhere];
表的基础行数越大,健康度百分比越容易失真,更新频繁的表建议定期进行手动统计信息收集
解决方法
注意:在重新收集统计信息之前建议先 Dump 下统计信息,以及对应的表结构,方便对问题的具体定位。或在新版本中校验问题是否得到有效解决
统计信息 Dump
通过以下接口可以获取数据库 ${db_name} 中的表 ${table_name} 的 json 格式的统计信息
http://${tidb-server-ip}:${tidb-server-status-port}/stats/dump/${db_name}/${table_name}
手动收集统计信息
ANALYZE TABLE TableNameList [ WITH NUM BUCKETS TOPN CMSKETCH DEPTH CMSKETCH WIDTH SAMPLES];