mysql为什么用B 树做索引_【面试现场】为什么MySQL数据库要用B+树存储索引?

原标题:【面试现场】为什么MySQL数据库要用B+树存储索引?

61c402fac1d8278090907264c9b8d52d.png

ef97c93400d45913a029702a63573a2f.png

话说两个多月前,小史通过了A厂的一面,两个多月后的今天,小史终于等到了A厂的二面。

简单的自我介绍后,面试官看了看小史的简历,开始发问了。

04239ce3c783d7f0d7dd348920f887d1.png

cc1fc83fd03af6d538bbcedb540490b2.png

86958c12d846cfa1262b789efa6aafda.png

小史:没问题,这个项目前端用的react+webpack,后端用的nginx+SpringBoot+Redis+MySql,前后端分离的,最后用docker进行容器化部署。主要模块有师生系统、课程系统、成绩系统、选课系统等。

5cac12f3517438665b7f2c63d5ef1d01.png

3eeea78268c375b941644da131e4b7e6.png

6a52a9a358dcb0c8eecaa317e653790a.png

81deb4bac4b8e25275273a453c4e89a2.png

09a39fdcb44bff06e48a1625b6e54427.png

这个项目的架构和说辞,小史早已背得溜溜的。

55348b010a90ecb4421892cbbdd07800.png

小史:底层mysql是存储,redis是缓存,dao层操作mysql,cache层操作redis,service层处理业务逻辑,rest api层为前端提供rest接口。前端这边用react进行模块化,webpack打包部署。网关nginx进行负载均衡。mysql、redis、nginx和springboot应用都放在docker里部署。

2cc5d9698986dd20de42c8aaf40049d9.png

6fd71cbe91f322c19b951809d1f37866.png

2e3ad430115d89d13ce68eaf42d91855.png

9a624dc6b8550cdb8e860c1e14c285e2.png

cd3b6342b4cc7f182675eb4cf29afa02.png

2899febb76a5753c7e98975c22836c60.png

62f765306fa03a6bfc1c7969459442c7.png

60844deecfcb2daceb9534919977314f.png

ee9f7f34d23222fa3a67299fcfeec829.png

e54653e7f4c8425af39fa604a6e9da90.png

004d1c8bd503bf17261549088662ebfe.png

d310596b8f33c9b87559d97d5d382e1c.png

b14dde4b558f2e889863bf357b8946d6.png

5000663f9757db4298f8141abdd68859.png

题目:为什么MySQL数据库要用B+树存储索引?

小史听到这个题目,陷入了回忆。

【前段时间的饭局】

话说吕老师给小史讲完人工智能的一些知识后,他们一起回家吃小史姐姐做的饭去了。

ecd417faf7f56901f04e47723b9d732b.png

2876feafdd666204423c43cc4ee02c65.png

【饭后】

4fc77aa6fd2f1cfc63ac9642e3ad61c6.png

6eaefa2c696a07b4dd0461a3f851efbb.png

吕老师:面试的时候一定是往深了问,不精通的话容易吃亏。不过面试时一般都是根据项目来问,项目中用到的技术,一定要多看看原理,特别是能和数据结构和算法挂钩的那部分。

81f4b053ac9efb6d3a2183dacb764799.png

fed69a2f8bf1333d9147bf0cd809b32c.png

9fa96dd18d24b6107465e553540d2378.png

小史:树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树,还有之前你教我的字典树。

【红黑树】

8d02b31bab7ee0a32fc3a3158c5b7144.png

一听到红黑树,小史头都大了,开始抱怨了起来。

d9d9ac96c8ffe868b62490f35cb05135.png

小史:红黑树看过很多遍了,但是每次都记不住,它的规则实在是太多了,光定义就有四五条规则,还有插入删除的时候,需要调整树,复杂得很。

c628dca7e2e8420a5f4c50aa7c055e9a.png

吕老师:小史,问你红黑树,并不是让你背诵它的定义,或者让你手写一个红黑树,而是想问问你它为什么这样设计,它的使用场景有哪些。

58c893f1e9f515921cb81bb78a7218d5.png

5d884b1cf984cc2a70b087f14c589e31.png

7da7bc1192e0283a5374ddc6e5507bbc.png

9af7abb8149145dec1f7224f26c00094.png

3b6367fc3bb80442ce68dfe38702456b.png

cb1b46e3c835b3ed9cb040fc6da8b72d.png

3b5dac266564e27757c6a2cca5a21ccd.png

cd11f183767c8cc805323e43ef744842.png

39ee739e8eaa6132117775c4f6c13c61.png

4260df3a19d60e891c5e546696fde94b.png

f844229d4dad8d1f0bf9bb2d9f16c426.png

77674d57f22ec8cba5b345ff5d6f2fad.png

1571834ad90a90c013ba4bd6fac17b9c.png

c961b5c50288acb4e8804132bfa716eb.png

d21813f0fa931d1b21a3ae39e94f4476.png

【B树】

6489fcefe96f7024d23be9ca8f292ac1.png

49884f58d56e749caee15f8197a0f91a.png

7a71a193c32bb1d10f244ce266964feb.png

9b3b1d22d411f22d129514410d4140c8.png

b5acadff924dd61e9685277609dc4807.png

20a9f7704dd068da33056fb136d345d6.png

375e34d8ab44b0407847bfa673d22cf8.png

3f3fea71bd7221b16524a24b5f653187.png

4b05d6f5e2409fa013191023dbf35cc2.png

fe9c33078fb9388e155d1b7e8798dc5f.png

0afed034af677d6514d05d170c03b1e2.png

0f08c9859684e4bf33afff1d21530ff6.png

32c6be5806757ea079107bab498ee54d.png

00fef17e329031d25e26b8882450f135.png

ff8dde7445118a4aba6e993ec768aa50.png

70853737450a1b4c00d725da1df67a95.png

2772269a90d7485cb56463c524862b5d.png

吕老师:小史,你要知道,文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。

1fb81512bb902392b154898649e42508.png

两个月前,小史面试没考虑内存情况差点挂了,传送门

ad58c9fa84c937380231ffdb381773e7.png

08d7cf5b1033a682f25ffcfdeab0d63f.png

087cb5c8317e67a0ebb79d03849fc1cc.png

fe4c067260914bbb5eb32a5c927a86cb.png

3e8b0c5e63d346fbe23e7e63e145bb2d.png

3c5b2c1dd26c23324d7b8f04a344e5c4.png

【B+树】

26a75f6fee6ee990daa30cf082ef57ac.png

e6aada8ce5abd113b03ff839b580e158.png

5c9e0601d38ab33c9ba5de76ef9e6f7b.png

f211b8fc2847e8844b4f745a16e5f67a.png

ec9c9ec6723fff113028db0afd8240d9.png

ae16491996ec99d8aaf9d638b7fe5820.png

fa0db30682fe63b82f18cb3c306d2dfe.png

吕老师:这也是和业务场景相关的,你想想,数据库中select数据,不一定只选一条,很多时候会选多条,比如按照id排序后选10条。

8210b757b27a3e9937905f38747ce58d.png

小史:我明白了,如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。

bdb4deb93fb87c1f6b6ff07d8699379a.png

c53e12e9b5d159b7f97570bb9c3edab8.png

【回到现场】

335e7649259a2630a1a723db33cb2682.png

7e8bbf69c0e5ed8389f82b23c802d9bb.png

小史:这和业务场景有关。如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了。

0af8e85908e3b52c016dcbcb88da4669.png

小史:而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

4e2e8be184d22f531c3ed7671c9fc2f0.png

HR和小史简单地聊了聊基本情况,这次面试就结束了。

小史走后,面试官在系统中写下了面试评语:

6d9c20ee0780c0bdce29aa5c502d6672.png

几天后,小史收到了A厂的offer。

6e72ac26fa29c18fa6373a48c8b43633.png

6c8f8f03cce414fb1b02529acff56cb2.png

亲爱的场粉们,面试现场的第一季到这里就全部结束了,感谢大家的支持,我们一起期待小史后面的故事。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值