谈谈索引的底层原理

都知道数据库建立索引可以在一定程度上提高查询效率。

但是为什么呢?很多人并不知情。

索引使用原则网络上那么多条,如果要靠死记硬背,太生范,进而导致我们在使用的时候会感觉艰难,其实可以从底层原理上去理解这些规则。

首先我们要知道,查询是信息的获取。在获取信息的时候,我们有时候可以很容易获得,有时候却很难。比如,你想要知道一条绝密的信息,如果光是凭借你自己去寻找答案,可能会找到,但是需要花费你巨量的时间,但是若是有人之前已经花费过巨量时间从而得到了这个信息,记录了下来,你仅仅需要找到这个人即可。

索引其实就是这个人,他知道后将整个消息记录了下来,每次你想要获得信息的时候,找到他,他可以很快的告诉你。

多快呢?

可以将这个人想象成一个记忆无限大,并且过目不忘之人,他可以几乎瞬间告诉你任何信息。

在mysql底层这个速度可以达到千万比一的速度。

说了这么多,还是没说到底是如何实现的

首先来看着这样的一个东西,这是一棵树,按照规律进行排列组合成这样一颗二叉树,说到规律,既然有了规律,自然是有了有用的信息(混沌状态是没有任何信息的),而且这是人为地,我们可以将信息按此规律存储进去,自然也有办法将之提取出来。

在这个过程中,由于我们已经在过去的时间将有用的信息存储了起来,在未来我们想要获取信息,自然就会比混沌状态更加容易的得到信息。

这就是二叉树的哲学原理。

花费了过去的时间加上一些空间能够得到现在时间的减少,当然,处在物理世界,这自然也是符合物理学原理的,相对论,只不过此刻是空间过多地转化为时间

不过,我们mysql索引的底层,并没有这么简单!

很多小伙伴估计都知道,红黑树是二叉树的进化体,因为它具有一些二叉树没有的优点。

其实这就像是规律的综合,如果一种规律过于简单,那么自然就会导致好像没有规律,于是信息就相对来说没有那么多了,因为信息就是复杂的诞生物。

哎呦,忍不住扯淡了。

其实说白了,就是二叉树首先会瘸腿,这是这个规律的一些bug造成的(不清楚的小伙伴可以去万能的搜索引擎求助),然后有了平衡二叉树,弥补了这个bug,这样就没有什么问题了。

然而.....

由于过于追求平衡,自然就会导致各种各样的问题,规律太死板的情况下,自然是没有什么好处的。具体到实际情况就是平衡二叉树维护起来更加消耗时间。

所以为了避免这种情况,就有了另一种规则,那就是红黑树,红黑树就是一种妥协,既然完全的平衡不好实现,那我们就退让一步,实现相对平衡,中庸之道的飞车飙到了极致,哈哈,开个玩笑,不过这确实是一种让步。

因此,一些牛逼的科学家就在理想与现实之间开始了挣扎,最终依靠强大的大脑,曲奇之中,红黑树之大法便生发了出来,顿时令世间其它大法销声匿迹。

到这里,真相大白。

索引的底层就是采用了红黑树的模型。

为什么说模型呢?

其实就是大概上采用的是红黑树的规律,但是具体的确是比这个要丰满的。

就像这样——

看到没,它不是一个节点存储一个东西,而是存储了两个,当然在我们索引的底层上也并不是两个,而是更多。不过,仔细观察,每一个节点和它的两个临近的子节点构成二叉树的结构

因为,内存区域是连续的,如果一个节点只是存储一条信息,那么未免就太浪费,所以,一个节点是存储多条信息,具体是多少,大家有兴趣可以自己算一算,大概一个节点占用16k的内存,每一个索引信息8B,外加上一个指针6B,就是14B

所以一个节点大概存储1170个吧

如果这棵树有三层,那么大概就是1170*1170*16

为什么最后一层说是16呢,因为在叶子结点中有数据存储(当然这是仅仅在innodb中,即聚簇索引),所以算做每一行数据为1K,那么大概,一棵树,就能够为两千多万个数据建立索引。

在查找两千多万的巨额信息中,我们只需要进行三次查找就可获得答案,你说,快不快!

大家还是忘了这个图吧,它不正规,来看下面这张(当然它还有个前辈BTree,需要得到前辈信息的自行修炼)

B+Tree

B+tree上存储是以Key-value的方式存储的,key就是索引建立的字段的值,value就是指针,即节点指向子节点的那个指针(存储着子节点的存储地址)。

每一个叶子结点没有指针(除了横向的指针),其中存储的是数据。

这个数据,在INNODB中(聚簇索引),就是我们真正的数据,因为聚簇索引的数据文件和索引文件是一体的,一句话说,INNODB存储数据的形式就是采用的是这样一棵树,并且每个节点的KEY就是表的主键,因此,INNODB必须要有主键,即使你不建立,它也会自动为你维护一个主键,不过,这个自动的主键你应该是看不到的

就像这样,哈哈 

所以,对于innodb存储引擎来说,我们使用自增主键的效果就很明显了,由于数据库本身的数据结构是依靠着主键去进行构建的,因此,当我们使用在自增主键的时候,我们会发现事半功倍。

另外,由于整颗树的每一层是顺序构建的,当我们使用字符串来存储数据的时候,我们就会需要首先将字符串转化为ascll码值进行比较,这是不仅会再次消耗性能,而且当我们在插入一个字符串主键的时候,若是需要将当前字符串插入到已经之前的节点中,那么就需要巨大的的改动,因此会带来整体的数据迁移和结构重构,这样损失的性能是超级强大。

这种就是MYISAM存储引擎 ,大家可以看到叶子结点中存储的是一个地址,这个地址要去另外的文件中获取信息。由于数据和索引是分离的,因此,MYISAM成为非聚簇索引

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值