mysql如何建立索引workbench_MySQL索引是如何让世界变得更快的

本文探讨了MySQL索引的发展,从早期的二叉树到红黑树,再到B树和最终采用的B+树。B+树作为数据库索引的主要结构,其平衡性和叶子节点的特殊设计使得数据检索效率大大提高,尤其适合大规模数据处理。文章强调了索引结构在提升数据处理速度方面的重要性,并鼓励读者深入理解技术背后的思考和应用场景。
摘要由CSDN通过智能技术生成

作者:高级Bug调查员

dae9d2ff482083dc53cd9cab6cb200b0.png

如果你是一个不了解互联网的人,那么你一定会惊叹信息化时代的发展之快、信息的传播之广。

如今的互联网处理信息的速度已经达到了万亿级别,光是过年期间的12306每秒的点击量就已经超过双十一的五倍,票次高达60亿。

人们再也回不去那个凡事都要出门亲为的时代了。

是什么让世界变快?又是什么让数据的快速处理变成可能?今天就来聊一聊MySQL索引的发展变化。

二叉树索引

索引是一种有序的数据存储结构。

在数据库刚刚兴起的年代,人们思考过如何能够快速的通过类似字典目录的结构实现数据的快速定位。

首先需要解决的问题就是有序性

e5415d6d2825494ded8b22bc97a3517a.png

有序性是索引的基石,一个有序的目录可以快速定位数据的位置,同时也可以快速定位索引在目录中的位置。

为了达到这一点,同样是快速的Hash散列函数就不起作用了,因为它是无序的,因此虽然MySQL同样支持 Hash索引,但绝大多数情况下都排不上用场。

人们很自然的想到了二叉树

cb093edfddc3bfd481b202ca49b70c16.png

二叉树是有序的数据存储结构,它是一个类似倒立生长的树型结构:

b4031db1305c0eada700ce65f53b3b7b.png

通过这样的结构,人们可以将数据表中的某一列建立一个这样结构的“目录”,每一个二叉树节点指向这个列值所在的记录地址,由此便可以完成快速定位数据的目的。

但是,虽然二叉树可以实现简单的快速查找,却依然存在一个致命的弊端——退化成链表。

为什么二叉树会退化成链表?

这是因为,如果表中的列呈现递增或递减的态势,那么在建立索引的时候,节点就会偏向一侧,形成单边的二叉树,最终和一个链表的结构完全一致。然而链表对快速定位数据的位置是完全排不上用场的。因此基于这个致命的问题,人们对二叉树做出了改进。

红黑树索引

红黑树是平衡二叉树,它是二叉树的一个变种。

b4c910350472c43fa56fa7db5f215ce5.png

红黑树的特点有很多,其中最重要的一个是平衡性,也就是说,当树中的节点呈现单边态势的时候,可以一定程度上进行结构的旋转,从而保证不会出现退化为链表的情况。

在Java 8 中,HashMap 的实现由原来的 数组 + 链表 的组合,改为了数组 + 红黑树的组合,一定程度上提升了数据的有序性,提高了查询性能。从侧面,也充分说明,红黑树比链表更适合搜索数据。

但人们又发现,红黑树虽然解决了二叉树退化成链表的问题,但是却并没有控制树的高度。

什么是树高度?简单来说就是树的层数。红黑树并没有控制树高度的方法,它会平衡节点的分配,但它依然会继续向下延伸,最后导致树结构越来越高。

那么如果一个元素在树的叶子节点上,而这个树高度有20到30左右,那么就需要搜索20到30次才能找到对应的元素,这在效率至上的时代是绝对不允许的。于是,人们又开始了新的求索之路。

B树索引

B树是一种可以设定固定高度的树结构,又叫多叉平衡树,它不仅具备平衡树的特性,同时也可以有效控制树的高度。

f65afbd9d92a10fee422d8e33cfd961c.png

B树索引在使用的时候,会先把根节点整个加载到内存中,然后在根节点中随机查找。

B树会根据设定的最大深度(即树高度)来调整每个节点所能容纳的元素个数,因此,根据最大深度的不同,可能特定的B树也会有不同的结构。

那每个节点最大容量是多少呢?

内存与磁盘的IO交互有一个数据量限制,一般是4KBytes。因此,MySQL为了将节点加载到内存的效率最大化,设置一个文件的默认“分页大小”,它恰好是读取量限制的4倍,即16K:

实际上,MySQL并没有安全遵照B树来设计索引,而是采用了B树的变种——B+树。

55ab8eff0b28058c89d298d72e09c260.png

B+树是一种改进的B树,与B树不同的地方有两点:

1、它将所有索引以外的数据域全部放到了叶子节点上,所以非叶子节点都只包含一个索引值和节点地址;

2、所有叶子节点都通过指针彼此相连。

这两点是B+树区别于B树的重要不同点。

B+树的叶子节点存储着所有表数据的地址或表数据其他的信息,这是为了可以让非叶子节点存储更多索引值,而叶子节点之间的指针,则是为了在进行范围搜索的时候,可以直接在叶子节点之间进行遍历或搜索,而不需要反复跨越多个父子节点,极大的节省了索引树搜索的时间

虽然这些听起来不是那么重要,但是设想一下千万级别的数据处理场景就会发现,一点微小的改进,可能就会让系统的处理性能达到质的飞跃。

MySQL索引总结

从二叉树到平衡树,从红黑树再到B树,再到B+树,索引的结构在发生着变化。

人们不断的思考着更优秀的索引实现方案,也在不断地刷新着数据处理的速度极限。

任何知识的学习,都不能离开它们的设计思考与应用场景。从B+树的特性,我们看到了人们在选择这项技术之前所作出的努力。甚至可以说,它的每一个特性,小到有序性,大到树的高度、叶子节点的指针,都尤其存在的必要性,将这些特性分析透彻才能够真正理解索引的变迁史。

这就是MySQL索引的一些总结和思考,虽然并不能完全解释它的构造原理,但希望这篇文章可以给大家打开一个新的大门。

大家可以多多评论留言,祝技术之路越走越顺利!

往期精彩:

大话Java 8 Lambda 表达式(一)

束缚程序员工资的,从来不是什么算法和设计模式

那些还在B站发弹幕问“有人在吗”的人,求求你们别再犯二了

七夕节,来聊一聊程序员的浪漫

注释有多重要,看了这一篇你还不重新思考一下吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值