「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」
索引
B+树
二叉树、平衡二叉树、AVL树、哈夫曼树、红黑树、B-树、B+树
讲索引必讲B+树,讲B+树就必得将整个树形结构回顾一遍
| 二叉树 | 平衡二叉树(AVL树) | 满二叉树 与完全二叉树 | 红黑树 | B-树(B树) | B+树 | 哈夫曼树 | |
|---|---|---|---|---|---|---|---|
| 特点: | 每个节点最多有两个子节点 | 每个子树左右子树高度差不超过1 | 满:每层都是满的 完全:将满的从右到左 、从下到上删除一部分节点 | 1. 叶子节点不存储数据 2. 根节点黑色,叶子节点黑色 3. 从一个节点到该节点的所有子孙节点都包含同样的黑节点数 | 一个节点可以有多个元素 | 在B-树的基础上所有叶子节点都是使用指针相互连接的 | 两个孩子节点的值之和是根节点的值 |
B树:相对于其他树结构,B树每个节点可以存储多个元素
B+树:相对于B树,B+树叶子节点之间使用指针相互关联
页
我们使用的操作系统从磁盘中获取数据是按照页(4kb)获取的,mysql从磁盘中获取的页是16kb
页的构成:
1、用户数据区域:也就是真实进行数据存储的数据区,使用链表结构存储
2、页目录:类似于书本的目录系统,简化查询操作提高查询销量
3、页头:其中有前后指针,也就是导致我们可以有双向的指针来获取前后的范围数据页
页是一种数据结构,使用这种数据结构有以下特点
1、有前后指针方便进行上下页的获取
2、有页目录,提升用户数据区域的查询速率
索引结构
下面就相当于是一个主键索引(聚簇索引)
总结:
B+树的非叶子结点就是所有页数据构成的一个树结构
B+树的叶子结点,存储的就是各个页的数据信息,页与页之间使用双向链表相互连接
所以这里的查询操作就变成了
- 首先去页构成的目录中使用二分查找到需要获取的页
- 从磁盘中取出页
- 在页目录中找到数据区域分配的组信息
- 在数据区域找到对应的数据
聚簇索引和非聚簇索引
聚簇索引一般是我们的主键索引,也就是主键id构成的一个索引结构。这个索引结构根节点的页就是对应的那条记录所在的页的数据区域(1 小黄 男 22,2 小红 女 23)
非聚簇索引:就是后续我们建立的索引,这种索引结构的叶子节点其实是其对应的主键id(22 1,23 2)。再使用获取到的这个主键id去回表来获取整个记录数据
哈希索引
也就是使用hash算法,使用链表的方式解决hash冲突,来定位到需要查询的结果信息
支持hash的引擎有MEMORY(这里需要谷歌),其他的引擎都通过各自的方式去支持hash方法。如InnoDB有一套自适应hash算法,内部实现还是采用了BT的方式,可以理解为BT索引的索引
设置hash索引是否生效:set global innodb_adaptive_hash_index=off/on
hash索引虽然使用hash算法的查询销量较高,但是有很多弊端,所以一般不建议随意使用
- 不支持范围查找
- 不支持查询排序
- 不支持模糊查找