简述Mysql的一些问题(持续学习中小林图解mysql中)
1.Mysql的null值是如何存放的?
mysql的compact行格式会把值为null的列存储到null值列表中。NULL 值列表也不是必须的。当数据表的字段都定义成 NOT NULL 的时候,这时候表里的行格式就不会有 NULL 值列表了。这样可以至少节省 1 字节的空间(NULL 值列表至少占用 1 字节空间)。但是null值列表并不是固定的1字节空间。当有一条记录有9个字段值都是null,就会创建2字节空间的null值列表,以此类推。
2.mysql怎么知道varchar(n)实际占用数据的大小?
mysql的compact行格式中会使用 变长字段长度列表 存储变长字段实际占用的数据大小。
3.varchar(n)中的n最大取值是多少?
varchar(n) 中 n 的最大取值与 MySQL 的版本、行格式以及字符集有关:
- 早期版本:在 MySQL 5.0.3 之前,varchar 类型的最大长度为 255 字节。
- 之后版本:在 MySQL 5.0.3 及以后版本,一行记录最大可以存储65535字节的数据,但是这个是包含 变长字段字节数列表占用的字节数 和 null值列表所占用的字节数,因此在算varchar(n)中n的最大值时,需要减去这两个列表所占用的字节数。
如果一张表只有一个 varchar(n) 字段,且允许为 null,字符集为 asci。varchar(n)中n最大取值为 65532。
计算公式:65535-变长字段字节数列表所占用的字节数-null值列表所占用的字节数=65535-2-1=65532。
如果有多个字段的话,要保证所有字段的长度+变长字段字节数列表所占用的字节数 + NULL值列表所占用的字节数<= 65535。
4.行溢出后,mysql是怎么处理的?
如果一个数据也存不了一条记录,InnoDB存储引擎会自动将溢出的数据存放到 溢出页 中。
compact行格式对行溢出的处理是这样的:当发生行溢出时,在记录的真实数据处只会保存该列的一部分数据,而把剩余的数据存放在溢出页中,然后真实的数据处用20字节存储指向溢出页的地址,从而可以找到剩余数据所在的页。
Compressed 和 Dynamic 这两种格式采用完全的行溢出方式,记录的真实数据处不会存储该列的一部分数据,只存储 20 个字节的指针来指向溢出页。而实际的数据都存储在溢出页中。
#mysql#