1. 程式人生 > >【漫畫】為什麼MySQL資料庫要用B+樹儲存索引?

【漫畫】為什麼MySQL資料庫要用B+樹儲存索引?

小史是一個應屆生,雖然學的是電子專業,但是自己業餘時間看了很多網際網路與程式設計方面的書,一心想進BAT網際網路公司。

話說兩個多月前,小史通過了A廠的一面,兩個多月後的今天,小史終於等到了A廠的二面。

簡單的自我介紹後,面試官看了看小史的簡歷,開始發問了。

【面試現場】

小史:沒問題,這個專案前端用的react+webpack,後端用的nginx+SpringBoot+Redis+MySql,前後端分離的,最後用docker進行容器化部署。主要模組有師生系統、課程系統、成績系統、選課系統等。

這個專案的架構和說辭,小史早已背得溜溜的。

小史:底層mysql是儲存,redis是快取,dao層操作mysql,cache層操作redis,service層處理業務邏輯,rest api層為前端提供rest介面。前端這邊用react進行模組化,webpack打包部署。閘道器nginx進行負載均衡。mysql、redis、nginx和springboot應用都放在docker裡部署。

題目:為什麼MySQL資料庫要用B+樹儲存索引?

小史聽到這個題目,陷入了回憶。

【前段時間的飯局】

話說呂老師給小史講完人工智慧後,他們一起回家吃小史姐姐做的飯去了。

【飯後】

呂老師:面試的時候一定是往深了問,不精通的話容易吃虧。不過面試時一般都是根據專案來問,專案中用到的技術,一定要多看看原理,特別是能和資料結構和演算法掛鉤的那部分。

小史:樹的話,無非就是前中後序遍歷、二叉樹、二叉搜尋樹、平衡二叉樹,更高階一點的有紅黑樹、B樹、B+樹,還有之前你教我的字典樹。

【紅黑樹】

一聽到紅黑樹,小史頭都大了,開始抱怨了起來。

小史:紅黑樹看過很多遍了,但是每次都記不住,它的規則實在是太多了,光定義就有四五條規則,還有插入刪除的時候,需要調整樹,複雜得很。

呂老師:小史,問你紅黑樹,並不是讓你背誦它的定義,或者讓你手寫一個紅黑樹,而是想問問你它為什麼這樣設計,它的使用場景有哪些。

【B樹】

呂老師:小史,你要知道,檔案系統和資料庫的索引都是存在硬碟上的,並且如果資料量大的話,不一定能一次性載入到記憶體中。

兩個月前,小史面試沒考慮記憶體情況差點掛了

【B+樹】

呂老師:這也是和業務場景相關的,你想想,資料庫中select資料,不一定只選一條,很多時候會選多條,比如按照id排序後選10條。

小史:我明白了,如果是多條的話,B樹需要做區域性的中序遍歷,可能要跨層訪問。而B+樹由於所有資料都在葉子結點,不用跨層,同時由於有連結串列結構,只需要找到首尾,通過連結串列就能把所有資料取出來了。

【回到現場】

小史:這和業務場景有關。如果只選一個數據,那確實是hash更快。但是資料庫中經常會選擇多條,這時候由於B+樹索引有序,並且又有連結串列相連,它的查詢效率比hash就快很多了。

小史:而且資料庫中的索引一般是在磁碟上,資料量大的情況可能無法一次裝入記憶體,B+樹的設計可以允許資料分批載入,同時樹的高度較低,提高查詢效率。

HR和小史簡單地聊了聊基本情況,這次面試就結束了。

小史走後,面試官在系統中寫下了面試評語:

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


歡迎工作一到五年的Java工程師朋友們加入Java填坑之路:860113481
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!