下面讲讲关于通过漫画形式生动理解MySQL数据库要用B+树存储索引原因,该形式的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完通过漫画形式生动理解MySQL数据库要用B+树存储索引原因你一定会有所受益。
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
![](/UpLoads/images/DATA/Prolanguage/20230107122518941619.jpg)
话说两个多月前,小史通过了A厂的一面,两个多月后的今天,小史终于等到了A厂的二面。
简单的自我介绍后,面试官看了看小史的简历,开始发问了。
![](/UpLoads/images/DATA/Prolanguage/20230107122518160111.jpg)
【面试现场】
![](/UpLoads/images/DATA/Prolanguage/20230107122518177847.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122518836153.jpg)
小史:没问题,这个项目前端用的react+webpack,后端用的nginx+SpringBoot+Redis+MySql,前后端分离的,最后用docker进行容器化部署。主要模块有师生系统、课程系统、成绩系统、选课系统等。
![](/UpLoads/images/DATA/Prolanguage/20230107122519274486.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519462180.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519655231.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519415467.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519184070.jpg)
这个项目的架构和说辞,小史早已背得溜溜的。
![](/UpLoads/images/DATA/Prolanguage/20230107122519653143.jpg)
小史:底层mysql是存储,redis是缓存,dao层操作mysql,cache层操作redis,service层处理业务逻辑,rest api层为前端提供rest接口。前端这边用react进行模块化,webpack打包部署。网关nginx进行负载均衡。mysql、redis、nginx和springboot应用都放在docker里部署。
![](/UpLoads/images/DATA/Prolanguage/20230107122519325406.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519804437.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519494255.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519504545.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122519919833.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520193947.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520144848.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520412579.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520795849.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520179814.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520273127.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520290688.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520858272.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122520192564.jpg)
题目:为什么MySQL数据库要用B+树存储索引?
小史听到这个题目,陷入了回忆。
【前段时间的饭局】
话说吕老师给小史讲完人工智能后,他们一起回家吃小史姐姐做的饭去了。
![](/UpLoads/images/DATA/Prolanguage/20230107122520169373.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122521220625.jpg)
【饭后】
![](/UpLoads/images/DATA/Prolanguage/20230107122521235133.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122521597331.jpg)
吕老师:面试的时候一定是往深了问,不精通的话容易吃亏。不过面试时一般都是根据项目来问,项目中用到的技术,一定要多看看原理,特别是能和数据结构和算法挂钩的那部分。
![](/UpLoads/images/DATA/Prolanguage/20230107122521290517.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122521759565.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122521558920.jpg)
小史:树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树,还有之前你教我的字典树。
【红黑树】
![](/UpLoads/images/DATA/Prolanguage/20230107122521271324.jpg)
一听到红黑树,小史头都大了,开始抱怨了起来。
![](/UpLoads/images/DATA/Prolanguage/20230107122521911235.jpg)
小史:红黑树看过很多遍了,但是每次都记不住,它的规则实在是太多了,光定义就有四五条规则,还有插入删除的时候,需要调整树,复杂得很。
![](/UpLoads/images/DATA/Prolanguage/20230107122521224682.jpg)
吕老师:小史,问你红黑树,并不是让你背诵它的定义,或者让你手写一个红黑树,而是想问问你它为什么这样设计,它的使用场景有哪些。
![](/UpLoads/images/DATA/Prolanguage/20230107122521574250.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522596018.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522631186.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522836910.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522605785.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522668024.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522822681.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522773396.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522795123.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522692149.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522767304.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122522877276.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523162976.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523593217.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523655073.jpg)
【B树】
![](/UpLoads/images/DATA/Prolanguage/20230107122523460309.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523437021.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523456633.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523370101.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523565691.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523790281.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122523750930.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524301837.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524985282.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524766780.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524153861.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524327046.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524157899.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524224949.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524424503.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122524194222.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122525154082.jpg)
吕老师:小史,你要知道,文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。
![](/UpLoads/images/DATA/Prolanguage/20230107122525893201.jpg)
两个月前,小史面试没考虑内存情况差点挂了
![](/UpLoads/images/DATA/Prolanguage/20230107122525369573.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122525930294.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122525423814.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122526562759.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122526307937.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122526806793.jpg)
【B+树】
![](/UpLoads/images/DATA/Prolanguage/20230107122526227824.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122526357131.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122526499730.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122526495564.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122527266122.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122527425259.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122527292095.jpg)
吕老师:这也是和业务场景相关的,你想想,数据库中select数据,不一定只选一条,很多时候会选多条,比如按照id排序后选10条。
![](/UpLoads/images/DATA/Prolanguage/20230107122527157648.jpg)
小史:我明白了,如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。
![](/UpLoads/images/DATA/Prolanguage/20230107122527641915.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122527942256.jpg)
【回到现场】
![](/UpLoads/images/DATA/Prolanguage/20230107122520192564.jpg)
![](/UpLoads/images/DATA/Prolanguage/20230107122527422543.jpg)
小史:这和业务场景有关。如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了。
![](/UpLoads/images/DATA/Prolanguage/20230107122528202287.jpg)
小史:而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。
![](/UpLoads/images/DATA/Prolanguage/20230107122528901222.jpg)
HR和小史简单地聊了聊基本情况,这次面试就结束了。
小史走后,面试官在系统中写下了面试评语:
![](/UpLoads/images/DATA/Prolanguage/20230107122528445543.jpg)
几天后,小史收到了A厂的offer。
![](/UpLoads/images/DATA/Prolanguage/20230107122528434399.jpg)
对于以上通过漫画形式生动理解MySQL数据库要用B+树存储索引原因相关内容,大家还有什么不明白的地方吗?或者想要了解更多相关,可以继续关注我们的行业资讯板块。