面试:B+树和B树的区别_通俗易懂的图文 红黑树,B树,B+树 本质区别及应用场景

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

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

面试现场

6f5fe984b82dc6a90b4dc2f4c8605e4c.png

895ba5056ae0ba6fb41460377a1bce75.png

小史:没问题,这个项目前端用的 React+Webpack,后端用的 Nginx+Spring Boot+Redis+MySQL,前后端是分离的,最后用 Docker 进行容器化部署。主要模块有师生系统、课程系统、成绩系统、选课系统等。

4c87bccc58048eed4618948e47facf77.png
2b75c370f30ba5b67461e156a5e4cf43.png

938e482969e209f8412f3ffc99952215.png

66a94f3f46bc0977ed395731bfdd2220.png

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

cbdab87ee9890aa5b8466ff516874bbd.png

小史:底层 MySQL 是存储,Redis 是缓存,Dao 层操作 MySQL,Cache层操作 Redis,Service 层处理业务逻辑,Rest API 层为前端提供 Rest 接口。

前端这边用 React 进行模块化,Webpack 打包部署。网关 Nginx 进行负载均衡。MySQL、Redis、Nginx 和 Spring Boot 应用都放在 Docker 里部署。

40f54f78d0847436c16a4502b89f01b8.png

2b423c97ba8507e405e41042b0f9d7ac.png

0d1835e0fcbe02c842a6495ebdff9c4e.png

d5629434cc6738c044dc8151103b39a0.png

279ee477ced019476bc9a24389d86161.png

e8ec50ae0fa409d08c6aebf91c20748a.png

8d348240f7e0b470883c21ed782f75c0.png

41c7a2199893625b69279a040f98342c.png

23412792d20ce12ba048a7e385de5c0c.png

362c43eefd71f4976c3c180a5c255292.png

8289f007de64d5a6eee1732ff153b401.png

12c7cb979d362d4c9b675599a1968813.png

4c02ce471efb1478a1aa94523733a6ac.png

1097028aa3146d1a46ac7ca2f0a41039.png

题目:为什么 MySQL 数据库要用 B+ 树存储索引?小史听到这个题目,陷入了回忆。

a52067e6eac35b6da5ff04b1554d35b8.png

前段时间的饭局

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

ad769e2b7b15f8dd9542d4100b809d53.png

ace3b6a82689946813ba0f49684aa000.png

90da63de4aac521f3de43f7ac61ff01c.png

d13984067ba5ba59f7d3baa7d37a4345.png

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

b70a6dd4266247e093e8174304568f7e.png

483edbb789c76b7f754e084666543a68.png

acdc574894aeed9a313bcacc0aa0e8df.png

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

红黑树

e75145fad32191fa88c8705e6e4d3581.png

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

60ba25e7cf57fbf2108f7f15ee86cb83.png

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

b64dae4db8be5a02076a01e30a80d40f.png

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

e6ce1d6bef1bf252cb40a07b2861c5af.png

e6705e13a7369acba66b9fe511ef4048.png

f191127ca9874114226a5899125bb592.png

ba79b51695ca1aa1b1ea6d7201dd6072.png

c665d39bf7d4e062ce60c0c9ff0a9f46.png

95896d72c9ad629ed2dd4084424a5393.png

458574207fa32199895fdb09091ba029.png

b4248213df0efc177c13043bfb587795.png

205d4cef77214af6bcb5068bc3ce22d9.png

bf225ac2f6c91a7085a635fe2db9bc18.png

a1a1de40bf59b7d73629f5b0c5c9a4db.png

c9eb1f6887e506f4ac9f76736e433c6a.png

9c63617d5ef96df07ede24f029406ae3.png

83e613b2d3d3e29ce46ae211476a2fcd.png

4490b9e087fa4aecc3caf2531023c028.png

B 树

207bacaf980a770af02fc0cb28edea8f.png

ae501f37e6f97365117c8b5ca77f5b71.png

4ba73fcf6c65d2ad182b395dc39a916b.png

b6e2ea9c489783a02a9b0e5c75bec881.png

59dd708ef7b02978c0ee1e171216b0e4.png

22e39ce32a6f240f0215d80908d940bf.png

6d2784f5fdb84c71cf709e77387f9ec2.png

065af7fc16188bd502f8a9b715a47959.png

c2b8e18b5450cbac4544938eee22fca2.png

59c0def9139131859c74850730b84140.png

3fba2710476a96771f783f779e46db13.png

b8907a3a976b29f4bfcc036afcfd8c2d.png

f15421e718c4b21f12572a6cd38457ce.png

5db5d1d93e9864e53555b8d06ac81fac.png

a2658abbc5b36ad915c7493e02954ca1.png

a3ba8a8a36c3dd8a926ccd8f73c61e57.png

4ad0aae51879e73f755219fd8608689e.png

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

906992d8ac4b6f0a3f442c35ca768696.png

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

2a8c2f7d39c3a2690f99efa760e9e556.png

e7248fc22a3449782bcfa80660a3182a.png

dbc29d7c1147775a847c1a09355dcb16.png

3e3694f6d6e3544c3d653f6198a5e9fb.png

8d216f6155ffd48d9a4da46f1dbc533b.png

dde0a4ade955d36156b1d50fe69a11df.png

B+ 树

7604919e5059ee59fe3be5c4c67bca29.png

c509f294055517840ffca13b9eea8729.png

9b0e993249e115c055c8d1f413b462b7.png

db063e57f3a27e609e952be48818e4e3.png

2b20ebe0c43b419a3c8384c3f3010b10.png

a4071b5c507d10a3ec93a965fa9056db.png

f807fa7badc9bb1bc4ec90cde978c65f.png

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

9ff77c31d82e8de0265aebf6ecd33a19.png

小史:我明白了,如果是多条的话,B 树需要做局部的中序遍历,可能要跨层访问。

而 B+ 树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。

eaa8f27ab6c64715cf99112e6801acad.png

f0944d7994010a12773e7b5393e3de03.png

回到现场

1097028aa3146d1a46ac7ca2f0a41039.png

3dad3bc83caac927e6803f7725c9f889.png

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

590c56f19916ba99a5df30a396b29568.png

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

3cd76cefc60b2def588d932825c49bd6.png

HR 和小史简单地聊了聊基本情况,这次面试就结束了。小史走后,面试官在系统中写下了面试评语:

47039fab230223162989f9f4fb3af080.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值