首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

漫画 | 为什么 MySQL 数据库要用 B+ 树存储索引?

  • 24-03-05 00:40
  • 3174
  • 6338
blog.csdn.net

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 |  channingbreeze
责编 | 郭芮

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

640?wx_fmt=jpeg

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

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


640?wx_fmt=png

面试现场


640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


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


640?wx_fmt=jpeg

小史:底层MySQL是存储,Redis是缓存,DAO层操作MySQL,Cache层操作Redis,Service层处理业务逻辑,Rest API层为前端提供Rest接口。前端这边用React进行模块化,Webpack打包部署。网关Nginx进行负载均衡。MySQL、Redis、Nginx和SpringBoot应用都放在Docker里部署。


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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


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



640?wx_fmt=png

前段时间的饭局



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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

【饭后】

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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


【红黑树】


640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


【B树】


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


【B+树】


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg



640?wx_fmt=png

回到现场



640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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


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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

亲爱的读者们,面试现场的第一季到这里就全部结束了,感谢大家的支持,我们一起期待小史后面的故事。


关于小史的面试故事,可点击回顾呦:


  • 起底 BAT 最喜欢什么样的程序员?

  • 英语不好的程序员,如何斩获外企 offer?

  • 非计算机专业如何靠自学杀进 BAT ?

  • 如何用编程 get 百万年终奖?

  • 如何找到字符串中的最长回文子串?

  • BAT 面试中,遇到知识盲点如何巧妙圆场?

  • 如何在 10 亿数中找出前 1000 大的数?

  • 漫画:如何用字典树进行 500 万量级的单词统计?

  • 如何设计可自学习的五子棋 AI?

  • 算到怀疑人生!如何用并查集解决朋友圈个数问题?


作者:channingbreeze,国内某互联网公司全栈开发。

声明:本文为作者投稿,版权归对方所有。

【完】


640?wx_fmt=jpeg

 热 文 推 荐 

☞IT 奇侠传

☞ 30 岁后,哪些职业瓶颈阻碍了你的成长?

☞ 漫画:什么是字符集和编码?ASCII、UTF-8、UTF-16、UTF-32 又是什么?

从倾家荡产到身价百亿,这个85后只用了8年

☞ 难逃寒冬裁员的“大追杀”,30 岁女码农该何去何从?

☞ OpenStack 2018 年终盘点

拼多多黄峥给陆奇“兼职”,欲挖掘这类AI人才

☞ 老程序员肺腑忠告:千万别一辈子靠技术生存!

 
 

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

640?wx_fmt=gif点击“阅读原文”,打开 CSDN App 阅读更贴心!

640?wx_fmt=png 喜欢就点击“好看”吧
CSDN
微信公众号
成就一亿技术人
注:本文转载自blog.csdn.net的CSDN资讯的文章"https://blog.csdn.net/csdnnews/article/details/85822803"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top