一、数据库的存储结构
索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的 存储引负责对表中数据的读取和写入工作。不同存储引擎中 存放的格式一般是不同的,甚至有的存储引擎比如Memory都不用磁盘来存储数据由于InnoDB 是MySQL的默认存储引擎。
1.1 磁盘与内存交互基本单位:页
- InnoDB 将数据划分为若干个页,InnoDB中页的大小默认为 16KB
- 以页作为磁盘和内存之间交互的基本单位,也就是一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。也就是说,在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页 (Page),数据库i/0 操作的最小单位是页。一个页中可以存储多个行记录。
- 记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(也就是一次 I/O 操作)只能处理一行数据,效率会非常低。
1.2 页的结构
名称 | 占用大小 | 说明 |
File Header | 38字节 | 文件头,描述页的信息 |
Page Header | 56字节 | 页头,页的状态信息 |
Infimum+Supremum | 26字节 | 最大记录和最小记录,这是两个虚拟的行记录 |
User Records | 用户记录,存储行记录的信息 | |
Free Space | 空闲记录,页中还未被使用的空间 | |
Page Directory | 页目录,存储用户记录的相对位置 | |
File Trailer | 8字节 | 文件尾,校验页是否完整 |
1.2.1 File Header(文件头)结构
名称 | 作用 |
FIL_PAGE_OFFSET (4字节) | 页号 |
FIL_PAGE_TYPE (2字节) | 页的类型 |
FIL_PAGE_PREV / NEXT (4字节) | 指向前一页或后一页 |
FIL_PAGE_SPACE_OR_CHKSUM (4字节) | 校验和,检验页是否完整 |
FIL_PAGE_LSN (8字节) | 最后被修改时日志的位置 |
1.3 行格式
1.3.1 操作行格式的语法
# 创建表时指定行格式
CREATE TABLE tb1 (id int, lname varchar(20)) row_format='行格式名字';
# 查看表的行格式
SHOW TABLE STATUS LIKE '%表名字%'\G
# 修改表的行格式
ALTER TABLE '表名' row_format='行格式';
1.3.2 行格式的分类
COMPACT行格式
- 变长字段长度列表
- NULL值列表
- 记录头信息(5字节)
- 记录的真实数据
列名 是否必须
描述
row_id(6字节) 否 行ID,唯一标识一条记录 transaction_id(6字节) 是 事务ID roll_pointer(7字节) 是 回滚指针 - 真实数据
Dynamic和Compressed行格式
Redundant行格式