Mysql面试全解(四)

84 阅读3分钟

「这是我参与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+树的叶子结点,存储的就是各个页的数据信息,页与页之间使用双向链表相互连接

所以这里的查询操作就变成了

  1. 首先去页构成的目录中使用二分查找到需要获取的页
  2. 从磁盘中取出页
  3. 在页目录中找到数据区域分配的组信息
  4. 在数据区域找到对应的数据

聚簇索引和非聚簇索引

聚簇索引一般是我们的主键索引,也就是主键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算法的查询销量较高,但是有很多弊端,所以一般不建议随意使用

  • 不支持范围查找
  • 不支持查询排序
  • 不支持模糊查找