mysql索引數(shù)據(jù)結(jié)構(gòu)介紹

小史是一個(gè)應(yīng)屆生,雖然學(xué)的是電子專業(yè),但是自己業(yè)余時(shí)間看了很多互聯(lián)網(wǎng)與編程方面的書(shū),一心想進(jìn)BAT互聯(lián)網(wǎng)公司。

image

話說(shuō)兩個(gè)多月前,小史通過(guò)了A廠的一面,兩個(gè)多月后的今天,小史終于等到了A廠的二面。

簡(jiǎn)單的自我介紹后,面試官看了看小史的簡(jiǎn)歷,開(kāi)始發(fā)問(wèn)了。

面試現(xiàn)場(chǎng)

image
image

小史:沒(méi)問(wèn)題,這個(gè)項(xiàng)目前端用的react+webpack,后端用的nginx+SpringBoot+Redis+MySql,前后端分離的,最后用docker進(jìn)行容器化部署。主要模塊有師生系統(tǒng)、課程系統(tǒng)、成績(jī)系統(tǒng)、選課系統(tǒng)等。

image
image
image
image
image

這個(gè)項(xiàng)目的架構(gòu)和說(shuō)辭,小史早已背得溜溜的。

image

小史:底層MySQL是存儲(chǔ),Redis是緩存,DAO層操作MySQL,Cache層操作Redis,Service層處理業(yè)務(wù)邏輯,Rest API層為前端提供Rest接口。前端這邊用React進(jìn)行模塊化,Webpack打包部署。網(wǎng)關(guān)Nginx進(jìn)行負(fù)載均衡。MySQL、Redis、Nginx和SpringBoot應(yīng)用都放在Docker里部署。

image
image
image
image
image
image
image
image
image
image
image
image
image
image

題目:為什么MySQL數(shù)據(jù)庫(kù)要用B+樹(shù)存儲(chǔ)索引?

小史聽(tīng)到這個(gè)題目,陷入了回憶。

image

前段時(shí)間的飯局

話說(shuō)呂老師給小史講完人工智能的一些知識(shí)后,他們一起回家吃小史姐姐做的飯去了。

image
image

【飯后】

image
image

呂老師:面試的時(shí)候一定是往深了問(wèn),不精通的話容易吃虧。不過(guò)面試時(shí)一般都是根據(jù)項(xiàng)目來(lái)問(wèn),項(xiàng)目中用到的技術(shù),一定要多看看原理,特別是能和數(shù)據(jù)結(jié)構(gòu)和算法掛鉤的那部分。

image
image
image

小史:樹(shù)的話,無(wú)非就是前中后序遍歷、二叉樹(shù)、二叉搜索樹(shù)、平衡二叉樹(shù),更高級(jí)一點(diǎn)的有紅黑樹(shù)、B樹(shù)、B+樹(shù),還有之前你教我的字典樹(shù)。

【紅黑樹(shù)】

image

一聽(tīng)到紅黑樹(shù),小史頭都大了,開(kāi)始抱怨了起來(lái)。

image

小史:紅黑樹(shù)看過(guò)很多遍了,但是每次都記不住,它的規(guī)則實(shí)在是太多了,光定義就有四五條規(guī)則,還有插入刪除的時(shí)候,需要調(diào)整樹(shù),復(fù)雜得很。

image

呂老師:小史,問(wèn)你紅黑樹(shù),并不是讓你背誦它的定義,或者讓你手寫(xiě)一個(gè)紅黑樹(shù),而是想問(wèn)問(wèn)你它為什么這樣設(shè)計(jì),它的使用場(chǎng)景有哪些。

image
image
image
image
image
image
image
image
image
image
image
image
image
image
image

【B樹(shù)】

image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image

呂老師:小史,你要知道,文件系統(tǒng)和數(shù)據(jù)庫(kù)的索引都是存在硬盤上的,并且如果數(shù)據(jù)量大的話,不一定能一次性加載到內(nèi)存中。

image

兩個(gè)月前,小史面試沒(méi)考慮內(nèi)存情況差點(diǎn)掛了,傳送門......

image
image
image
image
image
image

【B+樹(shù)】

image
image
image
image
image
image
image

呂老師:這也是和業(yè)務(wù)場(chǎng)景相關(guān)的,你想想,數(shù)據(jù)庫(kù)中select數(shù)據(jù),不一定只選一條,很多時(shí)候會(huì)選多條,比如按照ID排序后選10條。

image

小史:我明白了,如果是多條的話,B樹(shù)需要做局部的中序遍歷,可能要跨層訪問(wèn)。而B(niǎo)+樹(shù)由于所有數(shù)據(jù)都在葉子結(jié)點(diǎn),不用跨層,同時(shí)由于有鏈表結(jié)構(gòu),只需要找到首尾,通過(guò)鏈表就能把所有數(shù)據(jù)取出來(lái)了。

image
image

image

回到現(xiàn)場(chǎng)

image
image

小史:這和業(yè)務(wù)場(chǎng)景有關(guān)。如果只選一個(gè)數(shù)據(jù),那確實(shí)是Hash更快。但是數(shù)據(jù)庫(kù)中經(jīng)常會(huì)選擇多條,這時(shí)候由于B+樹(shù)索引有序,并且又有鏈表相連,它的查詢效率比Hash就快很多了。

image

小史:而且數(shù)據(jù)庫(kù)中的索引一般是在磁盤上,數(shù)據(jù)量大的情況可能無(wú)法一次裝入內(nèi)存,B+樹(shù)的設(shè)計(jì)可以允許數(shù)據(jù)分批加載,同時(shí)樹(shù)的高度較低,提高查找效率。

image

HR和小史簡(jiǎn)單地聊了聊基本情況,這次面試就結(jié)束了。

小史走后,面試官在系統(tǒng)中寫(xiě)下了面試評(píng)語(yǔ):

image

幾天后,小史收到了A廠的offer。

image
image

親愛(ài)的讀者們,面試現(xiàn)場(chǎng)的第一季到這里就全部結(jié)束了,感謝大家的支持,我們一起期待小史后面的故事。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容