对MySQL的数据行和行溢出机制的理解

文 / @UTHEME

MySQL是一种关系型数据库管理系统,它的数据行有两种格式:Compact格式和Redundant格式。Compact格式是一种紧凑的行格式,可以比Redundant格式节约20%的存储空间。Compact从MySQL5.0引入,MySQL5.1之后,行格式默认设置成Compact。MySQL的单行最大能存储65535byte的数据,但是当varchar的长度超过65532byte时,会发生错误,因为数据页中每一行中都有隐藏列,所以将varchar的长度降低到65532byte即可成功创建表。Compact格式的实现思路是,当列的类型为VARCHAR、VARBINARY、BLOB、TEXT时,该列超过768byte的数据放到其他数据页中去,能有效防止单个数据页存放的行记录过少,导致IO飙升的窘境。如果一个数据页存储的行超过了65532byte,会发生行溢出。当varchar列长度达到768byte后,会将该列的前768byte当作prefix存放在行中,多出来的数据溢出存放到溢出页中,然后通过一个偏移量指针将两者关联起来,这就是行溢出机制。MySQL使用的是B+Tree的聚簇索引,在这棵B+Tree中非叶子节点是只存索引不存数据,叶子节点中存储着真实的数据。同时叶子结点指向数据页。当单行存不下的时候,不能存在两个数据页中,因为MySQL想让一个数据页中能存放更多的数据行,至少也得要存放两行数据,否则就失去了B+Tree的意义,退化成一个低效的链表。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。