谈谈MySQL的索引

索引其实是MySQL里面的内容,而且我感觉是很高频的。我看了好多关于索引的文章,但是总感觉很困惑,虽然我之前在面试的时候没有被问过,但是我总感觉这很重要。而且,我希望将这个知识点有条理、有逻辑的说出来,而不是简单的几句话概括。

索引常见的模型有3种:哈希表,有序数组和树。

我们来看一个场景:假如现在有一张数据表(表中仅含有身份证号和名字字段的表),我要为这张数据表建立一个索引,那我应该如何选择索引模型呢?

假如我选择哈希表,那最大的好处是,当我添加一条数据进入数据表时,哈希表很容易对这张数据表同步,同步的方式就是直接追加写入哈希表既可。但是哈希表这种索引模型只适合那种查询一个数据的,你如果说想查询4406812020612001~4406812020612020这个区间的身份证号各自对应的姓名,那就比较麻烦了,你就只能通过20次哈希运算。因为你的哈希表是散列的,你不知道这20条数据都散落在哈希表中的哪些地方,你只能通过哈希运算来定位。

假如用有序数组做索引模型会怎么样?如果用有序数组做索引模型的话,无论是等值查询还是区间查询都非常好,但问题是如果我插入一条数据到数据表,那有序数组肯定会对数据进行同步嘛。如果这条数据是在中间插进有序数组中的,那就要挪动后面所有的元素,那太麻烦了。

所以我们想到了用树。树有很多种,我们先从二叉排序树讲起。

如果你用二叉排序树做索引模型的话,假如数据表中新增的数据都是有序的,那你二叉排序树就退化成了链表,那怎么办?

这时候我们就想到了用二叉平衡树做索引模型,二叉平衡树就是防止数据插入数据表有序而退化为链表的。但是二叉平衡树每次插入一个节点都要判断树是否平衡,效率太低了,怎么办?

我们又想到了用红黑树做索引模型,其实红黑树是一种特殊的平衡二叉树,而且对于调整树的条件相对没有一般的平衡二叉树严格。但用红黑树做索引模型其实也有问题,假如数据表中数据太大的话,这棵红黑树也很大,一次性根本放不进内存,怎么办?

B树!B树最大的特点是一个节点可以有多个数据,如果我们用B树做索引模型的话,那我们在将树载入内存的时候就可以一个节点一个节点的载入,这就可以放进内存了。但是问题又来了,因为B树每个节点都有value,区间查询的时候,很有可能会跨层访问,这会比较麻烦,有没有更好的索引模型呢?

B+树。B+树只有叶子节点有value,而非叶子节点都是key。同时,对于叶子节点,还用了链表连接起来,这样区间查询超级快。所以用B+树来作为索引模型是一个非常好的选择。

相关推荐
【D'accumulation】几秒前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
小叶学C++6 分钟前
【C++】类与对象(下)
java·开发语言·c++
2401_8543910810 分钟前
高效开发:SpringBoot网上租赁系统实现细节
java·spring boot·后端
Funny_AI_LAB17 分钟前
MetaAI最新开源Llama3.2亮点及使用指南
算法·计算机视觉·语言模型·llama·facebook
Cikiss18 分钟前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
wxin_VXbishe19 分钟前
springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290
java·spring boot·python·spring·servlet·django·php
Cikiss20 分钟前
微服务实战——平台属性
java·数据库·后端·微服务
NuyoahC24 分钟前
算法笔记(十一)——优先级队列(堆)
c++·笔记·算法·优先级队列
jk_10126 分钟前
MATLAB中decomposition函数用法
开发语言·算法·matlab
无敌の星仔29 分钟前
一个月学会Java 第2天 认识类与对象
java·开发语言