B+樹(shù)核心原理與C++實(shí)現(xiàn)詳解
1. 為什么選擇手撕B樹(shù)源碼第一次接觸B樹(shù)是在大學(xué)數(shù)據(jù)庫(kù)課程上當(dāng)時(shí)就被它優(yōu)雅的設(shè)計(jì)所吸引。工作后參與了幾次存儲(chǔ)引擎開(kāi)發(fā)才真正理解B樹(shù)在工業(yè)級(jí)系統(tǒng)中的核心地位。相比教科書上的理論講解親手實(shí)現(xiàn)一次B樹(shù)能讓你對(duì)以下問(wèn)題有更深刻的認(rèn)識(shí)磁盤I/O優(yōu)化到底如何體現(xiàn)在數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)中為什么MySQL的InnoDB堅(jiān)持使用B樹(shù)而非哈希表范圍查詢的性能優(yōu)勢(shì)從何而來(lái)我用C實(shí)現(xiàn)過(guò)三個(gè)版本的B樹(shù)教學(xué)版300行、工程版2000行、以及支持并發(fā)操作的工業(yè)級(jí)版本。本文將聚焦教學(xué)版實(shí)現(xiàn)帶你用最精簡(jiǎn)的代碼理解核心原理。2. B樹(shù)核心設(shè)計(jì)解析2.1 與B樹(shù)的本質(zhì)區(qū)別很多人分不清B樹(shù)和B樹(shù)關(guān)鍵差異在于數(shù)據(jù)存儲(chǔ)位置B樹(shù)所有節(jié)點(diǎn)存數(shù)據(jù)B樹(shù)只有葉子節(jié)點(diǎn)存數(shù)據(jù)葉子節(jié)點(diǎn)鏈接B樹(shù)葉子節(jié)點(diǎn)形成雙向鏈表鍵值重復(fù)B樹(shù)的內(nèi)節(jié)點(diǎn)鍵值會(huì)在葉子節(jié)點(diǎn)重復(fù)出現(xiàn)這種設(shè)計(jì)帶來(lái)三個(gè)核心優(yōu)勢(shì)范圍查詢只需遍歷葉子鏈表內(nèi)節(jié)點(diǎn)更緊湊緩存命中率更高所有查詢都要走到葉子節(jié)點(diǎn)性能穩(wěn)定2.2 節(jié)點(diǎn)內(nèi)存布局以order3的B樹(shù)為例其內(nèi)節(jié)點(diǎn)和葉子節(jié)點(diǎn)的內(nèi)存布局如下// 內(nèi)節(jié)點(diǎn) struct InternalNode { int keys[2]; // 最多2個(gè)key Node* children[3]; // 最多3個(gè)子節(jié)點(diǎn) }; // 葉子節(jié)點(diǎn) struct LeafNode { int keys[2]; string values[2]; LeafNode* prev; LeafNode* next; };注意這里使用了最簡(jiǎn)單的定長(zhǎng)設(shè)計(jì)實(shí)際工程中需要考慮變長(zhǎng)鍵值存儲(chǔ)內(nèi)存對(duì)齊預(yù)分配策略3. C實(shí)現(xiàn)關(guān)鍵步驟3.1 插入操作實(shí)現(xiàn)插入時(shí)的分裂邏輯是最容易出錯(cuò)的環(huán)節(jié)以插入key7為例void BPlusTree::insert(int key, string value) { if (root nullptr) { root new LeafNode(); // 初始化處理... } Node* cursor root; vectorNode* parents; // 用于回溯 // 1. 查找插入位置 while (!cursor-is_leaf) { parents.push_back(cursor); cursor find_child(cursor, key); } // 2. 執(zhí)行插入 if (cursor-keys.size() order - 1) { insert_to_leaf(/*...*/); } else { // 3. 分裂處理 LeafNode* new_leaf split_leaf(cursor); if (parents.empty()) { // 根節(jié)點(diǎn)分裂處理... } else { insert_to_parent(/*...*/); } } }關(guān)鍵點(diǎn)分裂時(shí)要正確處理前后指針中間鍵的上傳要準(zhǔn)確遞歸處理父節(jié)點(diǎn)分裂3.2 范圍查詢實(shí)現(xiàn)得益于葉子節(jié)點(diǎn)的鏈表結(jié)構(gòu)范圍查詢非常高效vectorstring BPlusTree::range_query(int low, int high) { LeafNode* start find_leaf(low); vectorstring result; while (start ! nullptr) { for (int i 0; i start-keys.size(); i) { if (start-keys[i] high) return result; if (start-keys[i] low) { result.push_back(start-values[i]); } } start start-next; } return result; }4. 調(diào)試與優(yōu)化實(shí)錄4.1 常見(jiàn)問(wèn)題排查分裂后指針錯(cuò)誤現(xiàn)象范圍查詢結(jié)果缺失檢查分裂時(shí)是否更新了prev/next指針修復(fù)添加指針校驗(yàn)斷言重復(fù)鍵值問(wèn)題現(xiàn)象查詢結(jié)果不符合預(yù)期檢查內(nèi)節(jié)點(diǎn)鍵值是否在葉子節(jié)點(diǎn)存在修復(fù)實(shí)現(xiàn)鍵值驗(yàn)證函數(shù)內(nèi)存泄漏現(xiàn)象長(zhǎng)時(shí)間運(yùn)行后內(nèi)存增長(zhǎng)工具Valgrind檢測(cè)修復(fù)實(shí)現(xiàn)節(jié)點(diǎn)引用計(jì)數(shù)4.2 性能優(yōu)化技巧批量加載優(yōu)化預(yù)先排序鍵值自底向上構(gòu)建樹(shù)結(jié)構(gòu)比單條插入快10倍以上緩存友好設(shè)計(jì)將頻繁訪問(wèn)的節(jié)點(diǎn)放在連續(xù)內(nèi)存使用預(yù)取指令實(shí)測(cè)可提升30%查詢速度寫優(yōu)化技巧延遲分裂策略批量寫入緩沖區(qū)減少磁盤I/O次數(shù)5. 工程化擴(kuò)展方向教學(xué)版實(shí)現(xiàn)后可以考慮以下進(jìn)階方向并發(fā)控制實(shí)現(xiàn)讀寫鎖嘗試無(wú)鎖編程處理死鎖場(chǎng)景持久化存儲(chǔ)設(shè)計(jì)文件格式實(shí)現(xiàn)WAL日志崩潰恢復(fù)機(jī)制生產(chǎn)級(jí)優(yōu)化壓縮鍵值存儲(chǔ)自適應(yīng)節(jié)點(diǎn)大小熱點(diǎn)數(shù)據(jù)識(shí)別我在GitHub上開(kāi)源了一個(gè)教學(xué)版實(shí)現(xiàn)約300行代碼包含詳細(xì)的注釋和測(cè)試用例。建議先理解這個(gè)基礎(chǔ)版本再逐步挑戰(zhàn)更復(fù)雜的實(shí)現(xiàn)。記住B樹(shù)的魅力不在于代碼本身而在于理解它如何平衡各種設(shè)計(jì)約束——這正是系統(tǒng)設(shè)計(jì)的精髓所在。

相關(guān)新聞

2026年長(zhǎng)沙托育vi設(shè)計(jì)從風(fēng)格定位到元素運(yùn)用的設(shè)計(jì)方法

2026年長(zhǎng)沙托育vi設(shè)計(jì)從風(fēng)格定位到元素運(yùn)用的設(shè)計(jì)方法

導(dǎo)語(yǔ)在長(zhǎng)沙的商業(yè)發(fā)展中,托育行業(yè)正逐漸嶄露頭角。2026年,長(zhǎng)沙托育機(jī)構(gòu)對(duì)于自身形象的塑造愈發(fā)重視,而VI設(shè)計(jì)則是其中的關(guān)鍵一環(huán)。通過(guò)專業(yè)的VI設(shè)計(jì),能精準(zhǔn)傳達(dá)托育機(jī)構(gòu)的理念與特色。相傳國(guó)際在品牌設(shè)計(jì)領(lǐng)域擁有豐富經(jīng)驗(yàn)&#xf…

2026/8/4 2:02:41 閱讀更多
AI翻唱實(shí)戰(zhàn):從So-VITS-SVC環(huán)境搭建到歌聲轉(zhuǎn)換全流程詳解

AI翻唱實(shí)戰(zhàn):從So-VITS-SVC環(huán)境搭建到歌聲轉(zhuǎn)換全流程詳解

最近在AI音樂(lè)生成領(lǐng)域,一個(gè)名為“阿爾貝萊特”的AI歌手翻唱《Notion》的視頻在網(wǎng)絡(luò)上引起了不小的關(guān)注。許多開(kāi)發(fā)者和技術(shù)愛(ài)好者都很好奇,這種高質(zhì)量的AI翻唱是如何實(shí)現(xiàn)的。本文將為你完整拆解從零開(kāi)始,使用開(kāi)源工具和模型,復(fù)現(xiàn)類…

2026/8/4 1:42:12 閱讀更多
MIPS逆向工程入門:從babymips實(shí)戰(zhàn)解析

MIPS逆向工程入門:從babymips實(shí)戰(zhàn)解析

1. 逆向工程入門:從攻防世界babymips開(kāi)始最近在逆向工程學(xué)習(xí)社區(qū)里,babymips這道題目經(jīng)常被提及。作為MIPS架構(gòu)的入門級(jí)逆向題目,它完美展現(xiàn)了逆向工程的基礎(chǔ)思維模式和常用技術(shù)路線。我第一次接觸這道題時(shí),花了整整兩天時(shí)間才完全…

2026/8/4 1:42:12 閱讀更多
如何在React Router 中設(shè)置重定向: 從基礎(chǔ)到進(jìn)階的完整指南

如何在React Router 中設(shè)置重定向: 從基礎(chǔ)到進(jìn)階的完整指南

一、React Router 重定向基礎(chǔ)概念:理解核心原理與應(yīng)用價(jià)值 1.1 什么是重定向及其典型應(yīng)用場(chǎng)景 重定向是指在用戶訪問(wèn)某個(gè) URL 時(shí), 自動(dòng)將其導(dǎo)航到另一個(gè) URL 的機(jī)制。在單頁(yè)應(yīng)用 (SPA) 中, 重定向是路由系統(tǒng)的核心能力之一, 常用于以下場(chǎng)景: 用戶未登錄時(shí)跳轉(zhuǎn)到登…

2026/8/4 3:12:43 閱讀更多
EIP低代碼平臺(tái)-應(yīng)用管理-自定義按鈕

EIP低代碼平臺(tái)-應(yīng)用管理-自定義按鈕

開(kāi)源框架模塊詳解|碼云開(kāi)源EIP低代碼平臺(tái) 倉(cāng)庫(kù)地址:https://gitee.com/sunzewei/eip_lowcode EIP低代碼平臺(tái) 應(yīng)用管理-自定義按鈕功能詳解 摘要 自定義按鈕(自定義動(dòng)作)是工作表拓展業(yè)務(wù)操作的核心能力。無(wú)需開(kāi)發(fā)編碼&#xff0…

2026/8/4 3:12:43 閱讀更多
SolidWorks_標(biāo)準(zhǔn)零件庫(kù)2_Toolbox基礎(chǔ)操作

SolidWorks_標(biāo)準(zhǔn)零件庫(kù)2_Toolbox基礎(chǔ)操作

Toolbox基礎(chǔ)操作:從庫(kù)中插入螺栓、螺母、墊圈等緊固件的標(biāo)準(zhǔn)方法摘要:在機(jī)械設(shè)計(jì)與三維建模過(guò)程中,標(biāo)準(zhǔn)緊固件(螺栓、螺母、墊圈)的重復(fù)建模一直是效率的殺手。本文將深入講解SolidWorks Toolbox的核心操作&#xff0c…

2026/8/4 3:12:43 閱讀更多
珠寶AI精修圖能直接用做主圖嗎?4K輸出夠不夠?一文說(shuō)清

珠寶AI精修圖能直接用做主圖嗎?4K輸出夠不夠?一文說(shuō)清

很多珠寶電商團(tuán)隊(duì)都在問(wèn):AI精修出來(lái)的圖,到底能不能跳過(guò)人工,直接上架當(dāng)主圖?4K分辨率是營(yíng)銷噱頭還是真實(shí)用?我們結(jié)合造像嘰 等珠寶專用AI生圖平臺(tái)千款實(shí)拍實(shí)測(cè),把這幾個(gè)問(wèn)題拆開(kāi)聊透。 AI精修后的珠寶圖&a…

2026/8/4 3:12:43 閱讀更多
BOM成本優(yōu)化實(shí)戰(zhàn):我用AI幫一塊板子降了34%物料成本,附完整流程

BOM成本優(yōu)化實(shí)戰(zhàn):我用AI幫一塊板子降了34%物料成本,附完整流程

作者:科技界的一粒微塵 📋 本文概覽:用一個(gè)真實(shí)板子的 BOM 優(yōu)化過(guò)程,完整展示 AI 輔助的端到端降本流程——從原理圖提取 BOM、逐器件查價(jià)、找替代料到最終成本對(duì)比。所有數(shù)字真實(shí)、流程可復(fù)制。案例背景 這塊板子是一塊工業(yè)控制板…

2026/8/4 3:12:43 閱讀更多
Double值比較真相揭秘

Double值比較真相揭秘

以下是各程序清單的執(zhí)行結(jié)果及核心要點(diǎn)解析: Listing 1: DoubleDemo class DoubleDemo {public static void main(String args[]) {Double d1 Double.valueOf(3.14159);Double d2 Double.valueOf("314159E-5");System.out.println(d1 " "…

2026/8/4 3:02:43 閱讀更多
清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

通訊作者:鄧兵、劉建國(guó)通訊單位:清華大學(xué)DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清潔能源技術(shù)與電子器件不可或缺的核心原料,然而傳統(tǒng)提取方式依賴能耗高、排放大的采礦與強(qiáng)…

2026/8/4 0:01:30 閱讀更多
貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

研究背景質(zhì)子交換膜燃料電池(PEMFCs)因其高能量轉(zhuǎn)換效率和清潔零排放特性備受關(guān)注,然而陰極氧還原反應(yīng)(ORR)動(dòng)力學(xué)遲緩、鉑催化劑成本高昂且耐久性不足的問(wèn)題嚴(yán)重制約了其商業(yè)化進(jìn)程。將 Pt 與 3d 過(guò)渡金屬合金化可調(diào)控…

2026/8/4 0:01:30 閱讀更多
福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

通訊作者:萬(wàn)宇馳、張久俊、呂瑞濤通訊單位:福州大學(xué) 、清華大學(xué)DOI:https://doi.org/10.1002/adfm.76112核心導(dǎo)讀:本文提出"分步升級(jí)"廢硝酸鹽處理新路線——利用廢水中的金屬離子經(jīng)快速焦耳熱(40V&#xff…

2026/8/4 0:01:30 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/3 7:44:46 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/3 12:53:38 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/3 19:34:52 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/3 19:34:54 閱讀更多