MySQL是怎样运行的
上一个思维导图
第5章 InnoDB数据页结构
数据页结构快览
- 页是什么:InnoDB管理存储空间的基本单位
- 数据页是什么:索引页,就是存放记录的页
- 页大小:16KB
- 页类型:根据存储内容而定,如inode、undo log信息;最关心的是存放记录(数据)的页
- 页与记录:一个页中可存放多条记录,所有的记录存在页的User Record区
页中存储的记录
- 被删除的记录并不会马上在页中清除,而是组成一个垃圾链表,置入可重用空间
- 多条记录在一个页中紧密排列,成为一个堆
- heap_no:每个记录都有自己的编号,分配以后即使删除也不变
- 页中有两条虚拟记录:Infimum(最小)和Supremum(最大)
- 记录大小=主键大小
- 无论记录被怎样增删改,页中记录会按照主键从小到大串联为一个单向链表
记录分组
- 必要性:单向链表的查询效率太低,对记录进行分组;在查找指定主键值的记录时使用二分法
页目录
-
why
- 能够使用二分法,提升查询记录的效率
-
what
- 数据页内的记录分组后,将每个组中的最后一条记录(主键值相对最大)的地址偏移量提取并放到靠近页尾的地方,组成页目录。
- 每一个地址偏移量称为一个slot
页的串联
- 一些数据可能非常大,需要用多个页来存储;将多个页串联成双向链表
页的加载与刷新
- 加载:InnoDB以页的形式将数据从磁盘加载到内存上进行操作
- 刷新:页中的数据在内存中被修改,需要在之后的某个时间刷新到磁盘上
第6章 B+树索引
没有索引的查找方式
-
单页查找
- 依赖主键列:二分法
- 依赖其他列:没有为非主键列建立页目录,只能从Infimum记录遍历单向链表
-
多页查找
- 定位到记录所在的页:没有索引的画只能在数据页组成的双向链表上遍历
- 进行单页查找
B+树
-
目录项
- 数据页双向链表中,页编号并不连续,为每个页生成一个目录项
- key:页的记录中最小的主键值
page_no:页编号/页号
-
目录项记录
- 复用存储用户记录的数据页存储目录项,使用record_type与数据页进行区分
- what:记录中只有key、page_no两列
- 用处:存储目录项记录的页中可以使用二分法快速定位某个页
-
多级存储目录项记录的数据页、存储真正用户记录的数据页,组成了B+树
- 数据页称为B+树的节点
- 真正的用户记录存在B+树的叶节点上
- 非叶节点存放目录项记录
-
聚簇索引
-
根据记录主键值的大小对记录和页进行排序
- 页内记录根据主键值组织为有序的单向链表
- 同一级的多个数据页根据主键值组织为有序的双向链表
-
叶子节点存放完整的用户记录
-
InnoDB自动创建聚簇索引,即聚簇索引就是InnoDB引擎中数据的存储方式
-
-
二级索引/辅助索引
- why:聚簇索引只能在依赖主键搜索时发挥作用
- what:以非主键列的值大小作为排序规则建立的B+树就叫二级索引
二级索引叶子节点的用户记录中只有两列:用来排序的非主键列、主键列 - 回表:根据非主键列查到记录后需要用对应的主键值回到聚簇索引中查询一条完整记录
- 实际的二级索引=以(排序非主键列,主键列)建立的联合索引
-
根节点不变
- 自创建索引之时起,根节点的页号不变
MyISAM索引方案
- 1、将用户记录(数据)存放到数据文件,每个记录对应一个行号
- 2、索引的叶节点存储的不是完整的用户记录,而是(主键值,行号)
- 查询方式:先通过索引找到行号,再根据行号去找对应的记录
相当于MyISAM中全是二级索引
根据主键值查找用户记录
1、确定存储目录项记录的页
2、在存储目录项记录的页中确定用户记录真正所在的页
3、在记录真正所在的页中确定记录的位置
快速查询记录
每个数据页生成一个页目录,使用二分法根据主键值快速定位目标slot,在目标slot内遍历查找记录
两个链表
一个数据页中的记录按照主键值的大小组成单向链表
数据页之间组成双向链表