MySQL 的数据存放在哪个文件?
MySQL 的数据存放在哪个文件?
存放在idb文件中
表空间文件的结构是怎么样的?
段-区-页-行,四个等级
行:保存数据的最小单位
页:mysql按照页读取数据,默认页大小为16KB
区:
B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。
用于innodb管理数据,默认区大小为1MB,可以存储连续的64个页
段:
段一般分为数据段、索引段和回滚段等。
- 索引段:存放 B + 树的非叶子节点的区的集合;
- 数据段:存放 B + 树的叶子节点的区的集合;
- 回滚段:存放的是回滚数据的区的集合,之前讲事务隔离 (opens new window)的时候就介绍到了 MVCC 利用了回滚段实现了多版本查询数据。
InnoDB 行格式有哪些?
InnoDB 提供了 4 种行格式,分别是 Redundant、Compact、Dynamic和 Compressed 行格式。
Mysql5.7之后默认使用Compredded格式
COMPACT 行格式长什么样?
|变长字段长度列表|NULL列表|头信息|row_id|trx_id|roll_ptr|列1值|列2值|...|列n值
前三者都是记录的额外信息,后面的才是记录真实信息
记录的额外信息
分为三个部分:不定长字段长度列表,null值列表,头信息
不定长字段列表
保存着行的所有不定长字段占用字节大小,例如varcahr,text的长度都是保存在这里。
列表的信息和字段顺序相反,例如 有两个字段name,phone可以为空。
不定长字段列表保存的顺序从左到右是phone,name。
为什么「变长字段长度列表」的信息要按照逆序存放?
可以提交cpu缓存的命中率,并且记录头信息指向的是下一个记录的指针,从记录头信息往左读就是第一行数据的不定长长度,往右读是第一行的真实数据,比较方便
每个数据库表的行格式都有「变长字段字节数列表」吗?
不是,如果没有不定长字段就没有这个列表,节省空间
NULL 值列表
将存储着null值的字段保存到null值列表,也是按照字段顺序逆序排放,用01区分是否存放null
每个数据库表的行格式都有「NULL 值列表」吗?
不是,每个字段都不是not null的时候就不会有了。null值列表至少占用1字节
「NULL 值列表」是固定 1 字节空间吗?如果这样的话,一条记录有 9 个字段值都是 NULL,这时候怎么表示?
不是固定的,9个字段是null会创建2个字节的列表,一次类推
记录头信息
delete_mask :表明这行是否被删除
next_record:保存着下一条数据的记录头next_record位置
record_type:表明当前记录的类型,0普通记录,1b+树非叶子节点,2最小记录,3最大记录
记录的真实数据
除了自己定义的,还有三个隐藏字段:row_id,trx_id,roll_ptr
-
row_id:没有指定组件或者唯一约束的时候,作为主键保存,不是必须存在,占6字节
-
trx_id:记录着这个数据是由那个事务生成的,必须存在,占6字节
-
roll_ptr:记录上一个版本的指针,必须存在,占7字节
varchar(n) 中 n 最大取值为多少?
mysql规定,除了text,和blob不计入大小,每行最大65535字节,这个大小也包括了NULL 值列表和不定长字段长度列表,但是不包括三个隐藏字段
varchar的大小和字符集有关,如果是ascii,一个字符占一个字节。
如果n要最大,理想情况只有一个字段。
如果字段 not null,最大为65533,需要两个字节记录大小
如果字段可以为null ,最大65532,需要两个字节记录大小,一个字节记录null
行溢出后,MySQL 是怎么处理的?
记录的真实数据只会保存一部分,剩下放在溢出页中,真实数据处使用20字节保存着指向溢出页的地址
标签:字节,记录,列表,存放,MySQL,相关,null,数据 From: https://www.cnblogs.com/xiuer211/p/17700986.html