读性能慢-慢语句

统计信息

产生慢语句有很多种原因最常见的是,因为执行计划不准确导致的执行计划选错,或本身因为代码设计限制导致选错了执行计划下面分别说明

原因

统计信息的收集默认是自动进行的。自动收集需要满足两类条件

新表行数达到 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];

参考资料

统计信息简介

2 个赞