对一张经历过大量删除的表跑OPTIMIZE TABLE,看MySQL真实说了什么、又真实做了什么,验证它到底是不是真的整理了碎片。
代码-- seq_pk此时已经经历过大量删除(延续前两篇的实验数据) OPTIMIZE TABLE seq_pk;
Table Op Msg_type Msg_text seq_pk optimize note Table does not support optimize, doing recreate + analyze instead seq_pk optimize status OK
这句提示信息真实是MySQL自己给出的解释:InnoDB(以及大多数现代存储引擎)并不真的支持"原地整理碎片"这种轻量操作,OPTIMIZE TABLE对它们来说真实被翻译成了ALTER TABLE ... FORCE——按主键顺序把全部数据重新读出来,构建一张全新的、紧凑排列的表,再替换掉旧表。这不是"碎片整理",是真实的"推倒重建"。
OPTIMIZE之前: seq_pk.ibd = 360448 字节(只剩300行数据,但文件还是大表时期的大小) OPTIMIZE之后: seq_pk.ibd = 196608 字节 真实缩小了约45%
每一步都是本文上面用真实磁盘文件跑出来的原始结果。
OPTIMIZE TABLE真实的执行输出 + 真实磁盘文件大小对比