mysql 一对多 根据多条数据排序_为什么MySQL数据库要用B+树存储索引?

小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进 BAT 互联网公司。

551704824acdaa8968f41222683835ce.png

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

6fd56cf5e5b22fc7eb7a04c6e05e5dad.png

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

面试现场

b674aa69c20ecc3f65a9e4745418dd8e.png

4bb45d9ce88209acb502894133fb6041.png

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

b09afa8da36d41ba0f77531cb61d9e6b.png

9c1d443a54480ff82fd0ac1a0e6e8586.png

6f6d661b02fe6bf408873ab681dd67e1.png

30300fb24746e5a2e3fb25fc1170dce3.png

3b14d06bc8d551b4fde0b66220e93c2e.png

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

d65f7e0fb906fdee46b0209ab79d0aff.png

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

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

ea5f928fc09549fc4c0eaa10826944fc.png

3afcfe0e76ad268bcdaed993b67ec673.png

9299a54732e2ced3f1f3cd05a8db41c6.png

92291d1f38b744e593a96ef8d6ef3e36.png

f8eb3ac3b48b980681f471fb0d91ee2c.png

142bbf67ebfd52722d5db7a811cbcb05.png

37ad31e8bd7ab2a36f8c720c77ed3b66.png

edc1f9e707236732967a0fff7590c90a.png

ef7e474f273927ef93ccdaeeb778f05d.png

1c0b88dde7a6c625519f8b8e9c0a2b3f.png

3343b54e78b22b3066be24b405cb52ed.png

2abe6ed0c2bf2a1cf13750a7a0bf1cab.png

c5a1b36a9e783778d4b1e50dcc6aa59e.png

e13451dbda0ebc0d59508d9f34373897.png

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

01a6a7131c5b3403aede28830674680b.png

前段时间的饭局

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

b6621a8d6d27720f4bffc2bd206ac617.png

753f99112be4eee3dbea8ae9a0da655d.png

26c9bf5d28186a5216eaebbc1c0e980e.png

450411690c0b874633c1e879676c9daa.png

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

0e60f47fba50529b53c872f7954216e2.png

e5b2cef62da83d6c625f5f7f64050375.png

13201bb6a08c200e677a0307d1c72545.png

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

红黑树

6c9a8f7cf811044320c8f7f1700c3c2a.png

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

1022060f5e013f5fab865a1ff40297a4.png

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

52836b2d61a8140ef5094c6976ac5d21.png

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

d34ee507267039ad2a9965f6adba7aff.png

c01ffd7b19a039f40b2e0d8e274474d2.png

46f9b790460ee25f065b72794e6a35ac.png

a366ea26112a7e5fe0e21eef99c37beb.png

e76831e371c17da989f9302b1824a7fd.png

2b938d29c763e80e386e68927235626e.png

d1b4043f6e00e201f3062165f78767d0.png

b24fcfd111a42736e92cbc7714d0696b.png

5d4b61e306b5bdf89523b0c52f7bf653.png

9e65296c6b380d5e0113062c7c340107.png

cd9abf3540fc10af72d85d65d0e21fb0.png

da954498e8829e71b86613f108f8071e.png

85e1dbb9d56f70d88dcb841277e59af2.png

038feffd06063e151d901bebc5abb496.png

d137aea9853f4d0ef95b71f094200eb7.png

B 树

3fe89ebfac77d9f5f4fc25da4dc07468.png

2b644f3c6d898955031da6e09ecd77ee.png

4dd934143f4f17f2552a0511cc3d854d.png

542f9c89ffae571ffc3385ffd588f915.png

8974711b69d572d55d9cb0a41ef158f8.png

c4ecd0ef835c8c12d810189bb144549b.png

7401d7b96b5d3b0f454a67a0da460666.png

40be59ef37fe2145e220f032a7bf2680.png

455bd9fa3c34de31e6d87bd8897b98b0.png

9a4545bb25c4bf7ea740b8c3cca4d173.png

cac55dbd15c8c5240fa543fa3dd07dfd.png

ba724368cc9a13411738a724d80c01c4.png

f79bceec7bb5cf431864632c3175b222.png

9be6629d010856b0d0bcba956d0d9153.png

082d2bad2c61edb5c1e8ecc9585bfc99.png

2e388d94825eb1d1dd7432035302e90e.png

93b306c1af537481d60ade2b73689d5a.png

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

8da91181884d58f464b5f4d61f646e64.png

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

2bfded6c58dc647d513702378a746272.png

88b30cfbf10ba19feb96aff622ff2fd4.png

54ece7039a56fa89943026726b4bc9a6.png

5e252e219227ce3ae90650bb72ec9a05.png

000b0d0edd8be2c013f67720be988a87.png

70981692bff9ab149c009f49a429d227.png

B+ 树

3d718024b2740815ae67e52822acb3fe.png

9602692f8f8159347f514150c415156c.png

b24ed867fb4c2b0dc2b81f88b49bce32.png

8c8d1cc2190627455ea3206fe471d63d.png

aed22658fbf9ba527cd48f052af87e2c.png

8cbfe68fe578297652374ec60a633e63.png

94694b758912c1ea3b1e503813e91844.png

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

03d616e825dbeb1ab5c0876c7dc007dd.png

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

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

15da65599c2752269943d3ec1a549f4b.png

efd43834975ff64815f9b909c745d3c4.png

回到现场

5dc5839fc8c48cd62810e83ab6403f24.png

3a2e0c53027e74e19f05aae288e23d1a.png

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

4c0db8e3973bad40fe0772bf4667c3b8.png

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

b9f085149f603fcd9551f3f638bef184.png

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

54e5b20c97536f06b9643729f531f0d4.png

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

713cf5ad6084a47708d1bffe4e42f91d.png

6712c4d3798dfe6bef7bda5d6063aba9.png

作者:channingbreeze

编辑:陶家龙、孙淑娟

出处:转载自微信公众号:互联网侦察

6c6997d4d8a8fc79fd92b6e22f6a97e5.gif

精彩文章推荐:

傻瓜都能看懂,30张图彻底理解红黑树!

老司机也必须掌握的MySQL优化指南

漫话:如何给女朋友解释反向代理?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值