谈谈MySQL的索引

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

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

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

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

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

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

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

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

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

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

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

相关推荐
Edward111111114 分钟前
tomcat_servlet
java·servlet·tomcat
短剑重铸之日16 分钟前
SpringBoot声明式事务的源码解析
java·后端·spring·springboot
李白的粉18 分钟前
基于springboot的银行客户管理系统(全套)
java·spring boot·毕业设计·课程设计·源代码·银行客户管理系统
JIngJaneIL21 分钟前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
长安er28 分钟前
LeetCode 20/155/394/739/84/42/单调栈核心原理与经典题型全解析
数据结构·算法·leetcode·动态规划·
MarkHD37 分钟前
智能体在车联网中的应用:第28天 深度强化学习实战:从原理到实现——掌握近端策略优化(PPO)算法
算法
努力的小南37 分钟前
Java字节码文件常量池索引两个问题
java·常量池·字节码文件·黑马jvm字节码文件常量池索引
期待のcode42 分钟前
Java的抽象类和接口
java·开发语言
while(1){yan}44 分钟前
SpringDI
java·jvm·spring·java-ee
陈平安安1 小时前
设计一个秒杀功能
java·数据库·sql