背景
本周有两天23号,25号凌晨开始生产某个日志业务应用连接池打满,新的读写请求失败,程序出现大量报错。该业务应用读写都在TiDB里,涉及TiDB版本5.1.4
分析
- 从grafana性能监控中发现,00开始P999延迟时间飙升到2m左右,tikv节点cpu利用率接近饱和,业务应用方最近没有新上线过(该业务应用上线几个月一直稳定运行)
- 从tidb dashboard热力图中发现23号00点开始xxx_23 xxx_25表读取量飙升,其它时间点没有异常现象
- 慢查询里对xxx_25表的update延迟在7~8分钟(正常时延迟几十ms内),执行计划显示该update是全表扫描(xxx_id和xxx2_id有联合索引),全表有百万级别数据量,多个没走索引的update对全表加锁 产生锁等待,延迟时间进一步加大
UPDATE
xxxx_25
SET
execute_status = 2,
msg = ''
WHERE
xxx_id = 6342
AND xxx2_id = 'xxxx';
- 自动收集表统计信息时间配置为01~08点
mysql> show global variables like '%tidb_auto_analyze%';
+------------------------------+-------------+
| Variable_name | Value |
+------------------------------+-------------+
| tidb_auto_analyze_end_time | 08:00 +0800 |
| tidb_auto_analyze_ratio | 0.5 |
| tidb_auto_analyze_start_time | 01:00 +0800 |
+------------------------------+-------------+
- 该业务应用是按天分表场景xxx_01~xxx_31,update,insert量大,自增id为auto_increment顺序生成;TiDB自动收集统计行为version为1
mysql> show global variables like '%tidb_analyze_%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| tidb_analyze_version | 1 |
+----------------------+-------+
处理
- 手动收集统计表统计信息后,该表读写量、延迟恢复正常,后面增加定时任务单独收集高TPS表统计信息
ANALYZE TABLE xxxx_25;
- 疑问是高TPS表除了单独收集表统计信息,有其它什么方式让它能自动正确收集统计信息?