mysql索引基数统计更新不及时_mysqlANALYZE分析表操作
EXPLAIN 的 rows 与实际扫描差异大是因为索引基数未及时更新优化器基于过时统计生成执行计划常见于大表频繁写入却未 ANALYZE TABLE 或 innodb_stats_auto_recalcOFF。为什么 EXPLAIN 显示的 rows 和实际扫描差很多因为 MySQL 的索引基数cardinality没及时更新优化器基于过时统计做执行计划。常见于大表写入频繁但长期没 ANALYZE TABLE或开启了 innodb_stats_auto_recalcOFF。触发时机只有在表数据变更超过 10%默认阈值且 innodb_stats_auto_recalcON 时InnoDB 才自动更新统计否则全靠手动影响范围只影响优化器对索引选择、连接顺序、是否走索引的判断不影响查询结果正确性查看当前基数SHOW INDEX FROM table_name 中的 Cardinality 列注意它只是估算值不是精确计数什么时候必须手动执行 ANALYZE TABLE不是“定期跑一下就安心”而是有明确信号才该动——比如执行计划突变、慢查询陡增、新加索引后没被用上。刚批量导入/删除大量数据后尤其 5% 行数重建或新增索引后ALTER TABLE ... ADD INDEX 不会自动触发统计更新SELECT COUNT(*) 和 EXPLAIN 预估行数偏差超过一个数量级例如预估 100 行实际扫 50 万确认 innodb_stats_persistent ON推荐否则统计重启后丢失每次都要重算ANALYZE TABLE 会锁表吗线上能直接跑吗取决于存储引擎和 MySQL 版本。InnoDB 在 5.6 默认只加 MDL 读锁允许并发 DML但仍有风险。 Shakespeare 一款人工智能文案软件能够创建几乎任何类型的文案。