谈谈MySQL的索引

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

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

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

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

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

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

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

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

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

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

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

相关推荐
ActionTech6 分钟前
MySQL 用好 Optimizer Trace,深刻理解 SQL 优化过程!
sql·mysql·oracle
what丶k18 分钟前
深度解析:以Kafka为例,消息队列消费幂等性的实现方案与生产实践
java·数据结构·kafka
星火开发设计22 分钟前
C++ 输入输出流:cin 与 cout 的基础用法
java·开发语言·c++·学习·算法·编程·知识
毕设源码-邱学长31 分钟前
【开题答辩全过程】以 基于Springboot的酒店住宿信息管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
We་ct32 分钟前
LeetCode 289. 生命游戏:题解+优化,从基础到原地最优
前端·算法·leetcode·矩阵·typescript
自己的九又四分之三站台33 分钟前
9:MemNet记忆层使用,实现大模型对话上下文记忆
人工智能·算法·机器学习
LXS_3571 小时前
STL - 函数对象
开发语言·c++·算法
Mr_Xuhhh1 小时前
MySQL索引深度解析:从原理到实践
数据库·sql·mysql
aini_lovee1 小时前
基于粒子群算法(PSO)优化BP神经网络权值与阈值的实现
神经网络·算法
仟濹1 小时前
【Java加强】1 异常 | 打卡day1
java·开发语言·python