此处推荐数据 《MySQL是怎样运行的:从根儿上理解MySQL》此书!!!
对于Innodb B+ 树的理解
1. 单个数据页结构
在innodb 中 页是管理存储空间的基本单位。(一般一个页是16kb)
数据页代表的这块大小的存储空间可以被划分为多个部分,不同的部分有不同的功能
注: 页与页之间并不是连续的存储单元。
例如: File Header 、Page Header 、 最大和最小记录、用户记录(User recode )
、空闲空间(Free Space)、页面目录、文件尾部等模块。
在平时 我们的数据就存储在用户记录这一块,每次插入数据都是从 Free Space 划分空间,
当 Free Space 空间不足的时候代表当前页已经被使用完,就需要申请新的数据页。
记录头:
在此记录一下 一个单条数据的记录头的结构
对于索引以及B+树的理解
首先介绍上面两个 记录头参数
1. recode_type 0: 表示普通数据 1:表示B+树非叶节点记录 2:表示最小记录 3:最大记录
2. recode_next 从当前记录的真实数据到下一条记录的真实数据地址偏移量。(其实是个链表)
在innodb 中 如果用户自己定义了主键则采用用户的,否则有隐藏列 row_id
每个数据由上面上记录头部加上用户定义数据构成,并且由id进行排序(如图最底层),这时候页数太多,就需要目录进行管理,此时除了最底层外 recode_type 都是 1 ,实际存放的是页数加上应的最小值。
此时这样的结构就是一个B+树。 只有叶子节点存放数据,其余的节点用来存放目录(也就是索引)
如果 B+ 树只有1层,也就是只有1个用于存放用户记录的节点,最多能存放 100 条记录。
如果 B+ 树有2层,最多能存放 1000×100=100000 条记录。
如果 B+ 树有3层,最多能存放 1000×1000×100=100000000 条记录。
如果 B+ 树有4层,最多能存放 1000×1000×1000×100=100000000000 条记录。
索引介绍
1. 聚簇索引 (索引即数据,数据即索引)
上边介绍的 B+ 树本身就是一个目录,或者说本身就是一个索引。它有两个特点:
1. 使用记录主键值的大小进行记录和页的排序,
- 页内的记录是按照主键的大小顺序排成一个单向链表。
- 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。
- 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录
的主键大小顺序排成 一个双向链表。
2. B+ 树的叶子节点存储的是完整的用户记录。
2. 二级索引和回表
假设上面是采用id 自动生成的b+树 这时候我们需要别的字段生成索引,就需要通过这个字段在生成
一个B+ 树,此时叶子节点的数据,就是原数据的ID,这时候创建的索引就是 二级索引, 此时通过 这
个字段查找就会产生回表 ,先在此b+树中找到 id 在回 以id为索引的b+树中查找实际数据。
3. 复合索引
符合索引就是按照多个字段进行创建索引,
例如 通过 C1,C2 创建索引
1. 先吧各个记录的数据按照 C1 列进行创建索引
2. 在记录列C1 相同的情况下在进行C2 进行排序
(此处也提现了最左匹配原则。)
本质上也是一个二级索引