谈谈MySQL的索引

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

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

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

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

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

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

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

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

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

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

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

相关推荐
凯凯姜18 分钟前
MySQL 联合索引设计与索引失效
数据库·mysql
w_zero_one1 小时前
算法--模拟
java·数据结构·算法
Javatutouhouduan1 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David2 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源2 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David2 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122662 小时前
网络编程^
java
薛定e的猫咪2 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪3 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
Thinker QAQ3 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing