mysql通过行记录怎么判断某个列是否发生了溢出
在mysql中,一行记录数据如果过大,为了满足一个页最少存2条记录,某些列可能会发生溢出
比如有个表t
create table t(c1 varchar(10000) not null) row_format compact;
我向这张表中插入一行数据
insert into t values(repeat('a', 10000));
按照mysql的默认配置,这时c1列就会发生溢出,mysql用一个页来存这个字段768个字节的前缀以及20个字节来记录溢出页的一些信息。
我的问题是,从mysql的记录格式有没有一个标识,说明c1列发生了溢出,这788个字节要按照有溢出的情况来解析。如果没有这么一个标识,mysql是怎么判断某一列发生了溢出?毕竟如果一个页没有发生溢出,也可能刚好这个字段的长度也是788个,比如我插入下面这一条数据应该是不会发生溢出的
insert into t values(repeat('a', 788));
变长字段中存了,如果存的是repeat(‘a’, 10000),那么ibd文件中该字段的长度为c314,如果存的是repeat(‘a’, 788),那么ibd文件中该字段的长度为8314,16进制的314为788,innodb中int类型数字第一个bit固定为1,因此c314可以理解为4314,8314可以理解为0314,这就是区别,相当于长度中的第二个bit位记录了当前字段是否溢出,同时也可以在源码中得到证明