数据库

数据库

范式

第一范式确保每列保持原子性

第二范式确保表中的每列都和主键相关

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

Mysql

Innodb数据存放

表空间文件结构

img

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执行流程

  1. 先与server的连接器建立连接
  2. 发送查询语句,server会先从查询缓存(查询缓存是 server 层的,也就是 MySQL 8.0 版本移除的是 server 层的查询缓存,并不是 Innodb 存储引擎中的 buffer pool。)查看,有就直接返回结果
  3. 进入解释器,进行语法分析生成语法树
  4. 依次通过预处理器(查看表的字段和表是否存在等工作,将*号扩展成所有列),优化器(基于查询成本看使用什么索引),然后到达执行计划当中,最后执行器执行
  5. 调用存储引擎api查询数据并返回
  6. 存入查询缓存