这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战
为什么需要索引
提高查询效率
索引很重要 - 要在初始就添加索引 - 通过了解内部机制知道在哪使用索引
InnoDB存储引擎索引
InnoDB支持的常见索引:
- 哈希索引 - 自适应,InnoDB根据表的使用情况自动添加,不能人为干预
- B+树索引 - 当前关系型数据库最常用最有效的索引,根据键值快速找数据 - b是balance B+树不能找到该数据行 - 找到该数据行所在的数据页 - 把也读入内存,在内存中查找 - 得到要查找的数据
B+树有关的算法与数据结构
二分查找法 - 折半查找法
基本思想 记录按有序化(递增或递减)排列,查找过程跳跃式查找
二叉查找树和平衡二叉树
最大性能地构造一棵二叉查找树 - 平衡二叉树【AVL树】
定义:
1. 符合二叉查找树
1. 任何节点两子树的高度最大差为1
查找性能较高 - 接近最高性能【最优二叉树(建立和维护需要大量的操作)】
一棵平衡树 - 维护有开销【左旋右旋】 - 多用于内存结构对象中 - 维护开销相对较小
B+树
B+树 - B树和索引顺序访问方法(ISAM)演化而来
为磁盘或其他直接存取辅助设备 设计的一种平衡查找树
所有记录节点 - 按键值大小顺序存放在同一层的叶子节点中,由各叶子节点指针进行连接
B+树的插入操作
保证插入后叶子节点中的记录依然排序
- 叶主均未满 - 直接插入
- 叶满主未满 - 叶拆分 - 中间放主 小于在左 大于右
- 叶满主也满 - 叶拆分 - 小于在左 大于右 - 主拆分 -中间往上 小于在左 大于右
新插入键值 - 可能要做大量的拆分页(split)操作 - 旋转【叶满 左右兄弟没满】减少拆分
B+树的删除操作
根据填充因子(fill factor)来控制 -** 50% 是 填充因子可设的最小值 **
- 叶主均小于 - 直接删,是主用右替
- 叶小主不小 - 合并叶和兄,更新主
- 叶主均不小 - 合并叶和兄,更新主,合并主和兄
B+树索引
B+树索引 - B+树在数据库中的实现
高扇出性 - 树高不会很高
**分类 **
- 聚集索引
- 辅助索引
叶子节点存放的是否是一整行的信息
InnoDB存储引擎表 - 索引组织表 - 表中数据按主键顺序存放
聚集索引 - 按照每张表的主键构造一棵B+树 - 叶子节点存放的是整张表的行记录数据【数据页】 - 索引组织表中的数据也是索引的一部分
聚集索引 - 能够特别快地访问范围值的查询 - 逻辑上连续
- 页通过双向链表链接,页按照主键的顺序排列
- 每个页中的记录也是通过双向链表进行维护
非数据页的索引页中 - 存放键值及指向数据页的偏移量
辅助索引 - 叶子节点包含 键值 - 每个叶子节点中的索引行包含 一个书签【告诉InnoDB存储引擎哪里可以找到与索引相对应的行数据】
InnoDB存储引擎表是索引组织表 - 辅助索引的书签是相应行数据的聚集索引键
B+树索引的分裂
Page Header以下部分保存插入的顺序信息:
- PAGE_LAST_INSERT
- PAGE_DIRECTION
- PAGE_N_DIRECTION
通过这些信息 - InnoDB存储引擎决定向左还是向右进行分裂,决定将分裂点记录为哪一个
- 插入是随机的 - 取页的中间记录作为分裂点的记录