查看原文
其他

有了这几个图,再也不怕面试问MySQL!

轩辕之风 轩辕的编程宇宙
2024-08-22

你好,我是MySQL,一位叫Monty的男人把我带到了这个世界上。

我诞生在90年代,那是一个互联网蓬勃发展的时代,因为我免费而且开源,许多互联网企业都选择我作为它们的数据库。

那段日子,我和另外三位大佬Linux、Apache、PHP 一起并称为 “LAMP” ,号称开源软件界的四大天王!成为网站开发的主流标准。

一晃多年过去,时过境迁,Apache和PHP两位老哥都逐渐沉寂,Nginx和Java渐渐取代了它们的位置,但我仍然活跃在互联网开发的一线,至今都是各位程序员哥哥面试大厂八股文里最亲密的伙伴。

作为一个数据库,首要任务的就是把数据存储好,并快速地查询出用户需要的数据。

想象一下,你手上有一本数学教材,但是目录被人给撕掉了,现在要你翻到讲三角函数的那一页,你该怎么办?

没有了目录,就只有两种办法,要么一页一页的翻,要么随机翻,直到找到三角函数的那一页。

对于我们数据库也是一样的道理,如果我的数据表没有“目录”,那要查询满足条件的记录行,就得全表扫描。

现在的互联网应用,数据量都非常大,百万千万都很常见了,这要是全表扫描,那可就恼火了,程序员们肯定早就把我抛弃了。所以为了加快查询速度,得给数据表也设置目录,用我们数据库圈内的行话来说,这就是索引。

想要实现查询,最简单的办法就是二分法查找。比如要根据ID来查找,就可以根据ID字段来构建一棵二叉树,顺着这棵二叉树,就能找到要查询的内容。

但普通的二叉树有一个毛病,随着新的数据节点不断插入,很有可能数据全都插到了同一边去,严重倾斜,极端情况下甚至变成了一个链表,这非常不利于我查询数据,为了防止这种情况的出现,可以把二叉树升级一下,变成一棵平衡二叉树,这样就要好一些。

很快我发现,当数据量变大以后,这棵平衡二叉树就会变得非常高,第一层1个节点,第二层最多2个节点,第三层4个,以此类推,即便是存1000行数据记录,二叉树都会变成10层。

查找一个数据可能就需要经过多次分叉,每一次分叉都需要读取一次硬盘数据。这样一来,一次查询就要进行多次IO操作,而硬盘那家伙,你是知道的,慢如蜗牛,要等待这么多次IO的完成,程序员估计急的想砸了我。

后来,我们数据库圈子里流行起来另一种树,叫做B树。

原来的二叉树里,一个节点只存储了一个数据,而在B树里,一个节点可以有许多个数据,并且它们按序排列起来。不仅如此,原来二叉树的一个节点最多只能开两个分叉,现在可以开非常多分叉,就像这样:

查找的时候,很简单,从根节点出发,先在根节点中查找,因为节点里的所有数据都是有序排列的,在这里面按照二分法就可以快速定位到。

如果没查到,就根据数据节点所在的区间,来到下一级分叉的节点,继续这个过程。

因为分叉很多,所以这棵B树变得非常扁平化,即便是非常大的数据量,也只需要很少几次IO访问就能完成查找,这一下查询速度直接起飞了。

有很多数据库小伙伴都采用了B树来作为数据存储和索引的数据结构。

什么,你要问我是不是也用了这个?

B树虽然好,但还是有一些问题。

比如,它的查询效率不太稳定,有些在根节点或者根节点附近能找到,搜索起来就很快。如果在叶子节点上,那查询起来就很慢,有的快有的慢,这对追求性能稳定的程序员们来说,就不是太友好。

另外,它也不适合用来做范围查找,因为数据散落在不同的节点上,要查询某个范围的数据,就需要在B树上不同层级节点间进进出出,非常麻烦。

所以我在它基础之上,改进了一下,我把数据全部都放在叶子节点上,这样不管查询哪个数据,最终都要走到叶子节点,解决了查询性能不稳定的问题。

其次,上面的这些节点都不存储数据了,腾出来的空间用来存储指向其他节点的指针,这样一来获得了一个额外的收获,中间节点可以分的叉更多了,整个树变得更加扁平,进一步减少IO的次数。

最后,我再把叶子结点用指针连接起来,这样就能解决范围查询的问题了,真是一颗完美的B树,哦不对,现在不能叫B树了,现在是B树的升级版,B+树!

自从用上了这样的结构,我的查询性能提升了不少,几百万级别的数据都能轻松拿捏了!

除了使用B+树,在一些特定的场景下,我还可以使用哈希表和位图来做索引,查起来比B+树更快!

过去这些年,虽然各种新的数据库层出不穷,但我因为简单好用,稳定可靠,而且还支持事务,所以我依然是许多互联网公司首选的数据库。

进入云计算时代以后,很多软硬件都上云了,我也不甘落后,开始在云端为大家服务。

有了云,你只需要一个地址和账户密码就能使用我了,不用再自己去安装,更省去了很多运维的麻烦,全部由云服务厂商为你解决,简直不要太方便。越来越多的公司和个人开发者都开始在云端来使用我了,其中不得不提的就是阿里云。

阿里云把我的代码拉了一个分支,对我进行了深度改造,经过双十一高并发、海量数据的考验,把我的性能又提升了一大截。

不仅如此,云端版本的我,使用了阿里云自研的内核加速技术,性能大幅提升,并且还使用了阿里云特有的云盘存储,比起本地蜗牛般的机械硬盘简直不要太爽了。有了云盘的加持,不仅IO速度变快了,数据的安全性也更高了,阿里云提供了全方位的安全防护措施,你把数据存在阿里云上,就把心放到肚子里吧。

哦对了,要告诉你一个好消息,最近,阿里云正在搞活动,推出了一个99计划,助力中小企业无忧上云,一年只需要99元就能在云端用上我。

原来需要一千多块钱一年的云数据库RDS MySQL,现在只需要99元了,无论你是企业开发部署,还是个人开发者,亦或是学习数据库的初学者,这都是一次绝佳的机会。阿里云RDS MySQL,作为年轻人的第一台数据库,大品牌值得信赖,极致的性价比,是开发者数据托管的最优选择!

只需要99,就能拥有我了,赶快来薅一把羊毛,链接就在这里,我在阿里云上等你来哦~

99元薅阿里云羊毛地址:https://www.aliyun.com/benefit?utm_content=m_1000391203

往期推荐


继续滑动看下一个
轩辕的编程宇宙
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存