MySQL MyISAM全固定长度整型列使用ROW_FORMAT=DYNAMIC体积减小原因问询
MyISAM两种行格式体积差异核心原因
1. ROW_FORMAT=FIXED的存储规则
FIXED行格式下,所有字段无论实际存储值是什么,都严格占用建表时定义的固定长度:
- 字段值为
NULL时,仍需占用对应类型的完整字节(例如INT类型即使为NULL也要占4字节) - 字段值为小数值(比如0、1)时,也不会缩减占用的存储空间
你场景中3GB的大小刚好匹配80万行 × 1600列整型的总固定长度,符合预期。
2. ROW_FORMAT=DYNAMIC的空间优化逻辑
哪怕所有字段都是固定长度的整型,MyISAM的DYNAMIC行格式也会做两项核心的空间优化:
- NULL值几乎不占空间:DYNAMIC格式仅在行头的NULL位图中用1位标记字段是否为NULL,NULL字段本身不会占用任何额外存储空间。如果你的表中大部分字段都是NULL,这部分的空间节省会非常夸张。
- 短值动态压缩存储:对于非NULL的整型字段,DYNAMIC格式会根据实际数值的大小动态调整占用的存储空间,不会强制占用字段定义的完整长度。比如你定义了
INT类型(占4字节),但实际存储的值是0,仅需要1字节就能存储,DYNAMIC格式会自动用最短的长度存储该值。如果你的表中大部分字段的值都是极小的整数,这部分也能带来数倍的空间节省。
以上两种优化叠加后,就会出现你看到的体积差达到15倍的情况。
内容的提问来源于stack exchange,提问作者guigoz
相关产品推荐
相关产品推荐

