数据库
范式
第一范式确保每列保持原子性
第二范式确保表中的每列都和主键相关
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
Mysql
Innodb数据存放
表空间文件结构
![img](https://cdn.xiaolincoding.com/gh/xiaolincoder/mysql/row_format/%E8%A1%A8%E7%A9%BA%E9%97%B4%E7%BB%93%E6%9E%84.drawio.png)
行
Redundant:不是一种紧凑的行格式
compact:是一种紧凑的行格式,5.1之后默认
dynamic:是一种紧凑的行格式,默认Dynamic
compressed:是一种紧凑的行格式
compact格式
变长字段列表:记录变长字段长度,倒序存放,使访问真实数据的时候能尽量在一个cacheline中
null值列表:记录是否为null值,大小取决于允许为null值的个数,单位为字节,同样是逆序存放
记录头信息:包含指向下一条数据的指针
row_id:行id(如果有主键或者唯一约束id那么就没有row_id)6字节
trx_id:事务id 6字节
roll_ptr:回退指针 7字节
真实数据
varchar(n) 中 n 最大取值为多少
Mysql规定除了text和blob,其他的列(不包括记录头信息和隐藏列,包括变长字段列表和null值列表)总和不超过65535个字节
varchar(n)中的n代表的是字节数,与字符集有关
要保证所有字段的长度 + 变长字段字节数列表所占用的字节数 + NULL值列表所占用的字节数 <= 65535
65532+2+1=65535
但是与字符集有关,需要处于对应的字节数才为个数
字符集
行溢出就会指向新增页的地址
Server执行流程
- 先与server的连接器建立连接
- 发送查询语句,server会先从查询缓存(查询缓存是 server 层的,也就是 MySQL 8.0 版本移除的是 server 层的查询缓存,并不是 Innodb 存储引擎中的 buffer pool。)查看,有就直接返回结果
- 进入解释器,进行语法分析生成语法树
- 依次通过预处理器(查看表的字段和表是否存在等工作,将*号扩展成所有列),优化器(基于查询成本看使用什么索引),然后到达执行计划当中,最后执行器执行
- 调用存储引擎api查询数据并返回
- 存入查询缓存