上次我们简单说了下字符集,今天我们讲一下mysql中InnoDb是如何存储行记录得。
存储引擎
简单说一下mysql常用得存储引擎。
MEMORY
数据只存储在内存,不存储在磁盘;多用于临时表。
MyISAM
主要支持非事物处理。
InnoDB
InnoDB行存储
InnoDB行存储得方式分为COMPACT、REDUNDANT、DYNAMIC和COMPRESSED这四种。
COMPACT
每一行得存储信息如下图所示。
变长字段长度列表
变长字段
变长字段包括varchar(m)、varbinary(m)、各种text类型、Blob类型,那什么是变长字段呢?
举个例子,变长字符串 varchar varchar(255) 所占资源空间是你存储内容得长度。
定长字符串 char char(8)不管你存储内容得长度是多少,它所占空间就是8,如果存储内容长度大于8,则会被截取。
varchar相较于char,更能节省资源空间。
如何存储?
内容所占字节数+数据内容,按照16进制存储,根据字段逆序存放,如果内容过大,部分数据则会溢出到其他页中(这个后续会说)。
null值列表
如果说把null都存储到真实信息里,会浪费空间,所以COMPACT把一行记录里得null字段统一维护到一起。采用16进制存储。
处理过程:
- 统计行中得null值列有哪些
- 如果不存在null值列则无null值列表,否则逆序存放,采用二进制存储,1为null,0为非null。
- 如果二进制位数不够整数个字节,则高位补0。(例如3个字段都是null,则表示为111,但是不够整数个字节,则改为00000111)。
记录头信息
下一条记录得相对位置。
记录得真实数据
隐藏列
真实数据
各个字段真正得数据。
非变长字段
我们上面讲解了变长字段得存储及每一行数据如何存储,那么非变长得字段如何存储呢?
举个列子,char(10)如果采用utf8字符集得话,所占空间为10-30个字节,在新增时会直接申请真正使用得空间,null得话则会申请10个字节,修改时如果小于当前空间则直接更新,一定程度避免了空间碎片。
后面得3种格式,下篇会统一介绍。