索引
- 各个数据页可以组成一个双向链表 每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表
2.下一个数据页用户记录的主键值必须大于上一个页中用户记录的主键值
-
当页中FreeSpace满了后 需要分配一个新页 新分配的页编号可能不是连续的 即使用的这些页在磁盘上不是连续存储的
它们只是通过维护上一页和下一页的编号建立的链表关系
页分裂
- 当插入的主键值小于上一个页中用户记录的主键值 则此时需要进行页分裂 将大于插入的主键值的记录移动到下一页 插入的记录插入到移动了的记录的空间中
- 目录项
- 目录项包括两部分
- 数据页中用户记录最小的主键值key
-
页号 用page_no表示
像上面这样的存储空间需要的太大 InnoDB设置了一种管理目录项的方式 它将每个目录项当作一条记录放到了页中 称为目录页( 仅仅存放目录项和主键等 目录页的记录通过主键大小依次排序
- 如何区分用户记录和目录项记录
-
record_type:0普通 1目录项
-
B+树
像上述这样存放用户记录和目录项记录的数据页 将它们存放的B+树这个数据结构中 这些数据页称为B+树的节点
聚簇索引
- 使用记录主键值的大小作为索引进行记录和页的排序
- B+树的叶子节点存储的是用户记录的完整记录(存储了所有列的值) 而不是只有记录的一部分真是数据
- 二级索引
- 使用自定义(非主键)的列作为索引构建B+树来进行查询 此时叶子节点中的记录不是完整的用户记录 只保留了一些自定义的键和主键 当查询到某条记录符合条件时 需要在该树中保存主键的值然后进行回表(在聚簇索引的B+树种)查找完整的用户记录
- 联合索引(复合索引
- 同时为多个列建立索引 这时 通过语句中的先后顺序进行 例如
index 索引名 (a1, a2);
此时先按a1创建该索引的B+树 然后a1值相同的情况下按a2大小进行排序
- 注意事项
- 内节点中目录项记录的唯一性
- B+树同一层结点内的目录项记录除页号外 还需要记录索引列的值 还要主键值 防止记录的索引列相同 插入的记录不知道插入哪个数据页