生产环境 TiDB v6.5.3,一条核心查询平时 200ms 左右,上周突然掉到 30s+,慢日志看是执行计划从索引扫变成了全表扫。检查发现统计信息已经三天没更新,期间数据量涨了差不多三成。手动 ANALYZE TABLE 后恢复正常,于是把 auto analyze 的收集比例阈值调低了些,但又担心频繁收集影响在线业务。想问下大家生产上一般怎么管理统计信息?是信任自动收集还是用定时任务手动跑?有没有必要再用 SPM 绑定执行计划兜底?
统计信息过期导致计划突变是很典型的问题。TiDB 的 auto analyze 触发依赖 tidb_auto_analyze_ratio 和表变更行数,默认 0.5 表示变更超过 50% 才触发,你们数据涨三成还没到阈值,所以没自动收集。调低阈值确实会增加收集频率,但 ANALYZE 是轻量级的,对在线影响可控,关键是避开业务高峰。
1 个赞
排查挺利落,手动 ANALYZE 止损这步走得对。补充个细节:v6.5 的 auto analyze 默认触发比例是 0.5,数据涨三成其实达不到,这才是三天没更新的根因,光调低阈值有点治标。建议配合 tidb_auto_analyze_start_time 把收集窗口限定在业务低峰,平时用 SHOW STATS_HEALTHY 盯健康度就够。SPM 我建议直接上,核心 SQL 用 CREATE GLOBAL BINDING 把好计划锁住兜底,代价是数据分布大变时要记得 review 绑定,但总比线上再飙到 30s 强。