1. MySQL 中 information_schema 与 OPTIMIZE TABLE 的膨胀检测?
如何用 information_schema 检测 MySQL 表/索引膨胀?OPTIMIZE TABLE 如何回收膨胀空间?
- information_schema.tables 的 DATA_LENGTH、INDEX_LENGTH 与 DATA_FREE 估算碎片率
- OPTIMIZE TABLE 重建表回收碎片与更新统计
- 大表执行的额外空间与低峰窗口
检测:information_schema.tables 提供 DATA_LENGTH(聚簇索引页占用)、INDEX_LENGTH(二级索引页占用)与 DATA_FREE(表中空闲/碎片空间),碎片率 ≈ DATA_FREE / (DATA_LENGTH + INDEX_LENGTH),超过 20%~30% 或 DATA_FREE 绝对量很大时值得整理;也可对比 DATA_LENGTH 与统计行数×行大小估算膨胀程度。
回收:OPTIMIZE TABLE 对 InnoDB 执行"表重建 + 统计刷新"——重写聚簇索引与全部二级索引,合并碎片页、消除空洞、压缩文件大小;8.0 下走在线 DDL(允许并发 DML,构建期间记录变更并重放),但仍需额外临时空间(重建文件与日志)且耗时较长。注意事项:大表执行前确认磁盘余量、选择低峰窗口;对 MyISAM 则是整表重写并加锁;碎片率低时执行纯属浪费。
本题考察膨胀检测与回收的完整链路:information_schema 的字段计算碎片率,OPTIMIZE TABLE 的机制与成本,以及执行时机判断。