如何通过执行Analyze命令更新SQL大表修改后的统计信息?
- 内容介绍
- 相关推荐
本文共计702个文字,预计阅读时间需要3分钟。
许多数据库(如PostgreSQL、MySQL 8.0的InnoDB)在执行UPDATE、DELETE或INSERT操作后,不会自动触发系统计信信息刷新。优化器依赖的行数估算、列值分布、直方图等,可能需要手动执行ANALYZE命令更新。若修改量超过表总行数的10%-20%,执行计划就可能优化不当——例如,本应走索引却选择了全表扫描。
什么时候必须手动执行 ANALYZE
以下情况建议立即运行 ANALYZE:
- 单次修改了 >5% 的数据行(例如对千万级表
UPDATE百万行) - 新增或删除了大量重复值(如批量填充某字段为相同状态码)
- 执行完
VACUUM FULL或CLUSTER(PostgreSQL)后 - 查询响应时间突增,且
EXPLAIN显示预估行数偏差 >10 倍
ANALYZE 的实际执行要点
直接运行 ANALYZE 是安全的:它只读取数据、不锁表(PostgreSQL)、不阻塞 DML;但耗时与采样量正相关。
本文共计702个文字,预计阅读时间需要3分钟。
许多数据库(如PostgreSQL、MySQL 8.0的InnoDB)在执行UPDATE、DELETE或INSERT操作后,不会自动触发系统计信信息刷新。优化器依赖的行数估算、列值分布、直方图等,可能需要手动执行ANALYZE命令更新。若修改量超过表总行数的10%-20%,执行计划就可能优化不当——例如,本应走索引却选择了全表扫描。
什么时候必须手动执行 ANALYZE
以下情况建议立即运行 ANALYZE:
- 单次修改了 >5% 的数据行(例如对千万级表
UPDATE百万行) - 新增或删除了大量重复值(如批量填充某字段为相同状态码)
- 执行完
VACUUM FULL或CLUSTER(PostgreSQL)后 - 查询响应时间突增,且
EXPLAIN显示预估行数偏差 >10 倍
ANALYZE 的实际执行要点
直接运行 ANALYZE 是安全的:它只读取数据、不锁表(PostgreSQL)、不阻塞 DML;但耗时与采样量正相关。

