[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f1b300lqgtfmoj":3,"$f250wz8h39yydc":8,"$fh74d94c47b56":29,"$fkpj7wqdcw5wa":33,"$ffenyxv9t9al5":44,"toc--1053169275-5-5":48},{"description":4,"domain":5,"id":6,"keywords":4,"title":7},"","api.kongjs.com",1,"默认",[9,20,24],{"children":10,"icon":4,"id":11,"linkType":12,"linkUrl":13,"parentId":14,"sort":15,"status":16,"target":17,"title":18,"visible":19},null,"447369447469600768","URL","\u002F","0",0,"1","_self","首页",true,{"children":10,"icon":4,"id":21,"linkType":12,"linkUrl":22,"parentId":14,"sort":15,"status":16,"target":17,"title":23,"visible":19},"447369693859794944","\u002Fnotes","笔记",{"children":10,"icon":4,"id":25,"linkType":26,"linkUrl":27,"parentId":14,"sort":15,"status":16,"target":17,"title":28,"visible":19},"447369977960976384","PAGE","\u002Fabout","关于我",{"category":10,"categoryId":10,"cover":10,"description":4,"fileId":10,"id":30,"publishAt":10,"tags":31,"title":32},"453167887230705664",[],"Mysql面试核心知识",[34,37,40],{"children":10,"description":4,"id":35,"noteId":30,"parentId":14,"sort":15,"status":16,"title":36},"453168082769158144","MySQL索引失效的原因、失效场景",{"children":10,"description":4,"id":38,"noteId":30,"parentId":14,"sort":6,"status":16,"title":39},"453168213975375872","MySQL事务原理、四大隔离级别、MVCC深度详解",{"children":10,"description":4,"id":41,"noteId":30,"parentId":14,"sort":42,"status":16,"title":43},"453168354300010496",2,"B树与B+树 核心原理、完整区别、数据库选型原因",{"content":45,"contentType":46,"description":4,"title":43,"wordCount":47},"# B树与B\\+树 核心原理、完整区别、数据库选型原因\n\nB树（多路平衡查找树）与 B\\+树（B树的优化变种）是**磁盘数据库、索引结构**的核心底层数据结构。MySQL、InnoDB、文件系统均采用 B\\+树而非 B树，核心原因是 B\\+树更适配磁盘IO特性。本文用通俗语言、对比维度、场景差异，彻底讲透二者区别。\n\n## 一、前置核心认知\n\n1\\. 二叉树、AVL、红黑树**不适合磁盘存储**：树层高、IO次数多，磁盘寻道开销极大；\n\n2\\. B\u002FB\\+树是**多路平衡树**，矮、胖、层数极少，最大限度减少磁盘IO；\n\n3\\. 磁盘读写最小单位是 **页（Page）**，InnoDB 默认一页 16KB，B\\+树节点与磁盘页对齐。\n\n## 二、B树（多路平衡查找树）原理\n\n**核心特点：所有节点都存【索引key \\+ 数据data \\+ 子节点指针】**\n\n- **非叶子节点**：存key、数据、子节点指针，可直接命中数据\n\n- **叶子节点**：同样存储完整key和数据，所有叶子节点无有序链表连接\n\n- **平衡性**：所有叶子节点高度一致，天然平衡\n\n- **查找规则**：从根节点逐层比对key，命中即返回，无需走到叶子\n\n**致命缺点**：每个节点存储数据，单页存储key数量少 → 树层高变高 → 磁盘IO变多，范围查询极差。\n\n## 三、B\\+树（增强多路平衡树）原理\n\n**核心特点：非叶子只存索引，叶子存全部数据 \\+ 有序双向链表**\n\n- **非叶子节点（索引层）**：**只存key和子节点指针，不存data数据**，仅用于路由检索\n\n- **叶子节点（数据层）**：存储**全部key \\+ 完整数据**，整棵树所有数据都在叶子\n\n- **有序链表**：所有叶子节点按key从小到大串联成双向链表\n\n- **平衡性**：全程平衡，树高极低\n\n**核心优势**：索引节点极小、存储key极多、树高极低、**范围查询无敌**。\n\n## 四、B树与B\\+树 全方位核心区别（重点）\n\n|对比维度|B 树|B\\+ 树|\n|---|---|---|\n|**数据存储位置**|非叶子、叶子节点**都存数据**|**仅叶子节点存数据**，非叶子只存索引key|\n|**单节点存储容量**|小（存数据占用大量空间）|极大（只存key，一页可存成千上万个索引）|\n|**树的高度**|较高|**极低**（千万级数据仅3\\~4层）|\n|**单点查询IO**|可能更快（中途命中）|略慢（必须走到叶子节点）|\n|**范围查询能力**|极差，需要多次遍历、回溯|**极强**，叶子链表直接遍历，无需回溯|\n|**叶子节点结构**|无序、无链表连接|有序双向链表串联|\n|**重复key处理**|分散存储|非叶子冗余存储，叶子唯一完整存储|\n|**磁盘IO效率**|低，树层高、IO次数多|极高，树层极低、预读命中率高|\n|**适配场景**|少量单次查询、内存索引|**数据库索引、文件系统**|\n\n## 五、关键细节深度解读（面试高频）\n\n### 1\\. 为什么 B\\+树 树高极低？\n\nB树每个节点要存【key\\+数据\\+指针】，数据占用空间大，一页能存的key数量少；\n\nB\\+树非叶子节点**只存key和指针**，无数据冗余，单页可存储数千个索引key，分支度极大，树被压得极矮。\n\n举例：16KB页，key为8字节主键，千万级数据 B\\+树仅需**3层**，最多3次磁盘IO即可查到数据。\n\n### 2\\. 为什么数据库需要范围查询？\n\nSQL 中 `between、>、\u003C、like、order by` 全是范围查询：\n\n- B树：范围查询需要中序遍历，频繁回溯上层节点，IO爆炸\n\n- B\\+树：找到起始叶子节点，直接顺着链表向后遍历，**一次IO批量读取**\n\n### 3\\. B树单点查询真的更快吗？\n\n理论上是：B树非叶子可直接命中返回，不用走到叶子；\n\n但工程上几乎无影响：\n\n- B\\+树树高极低，多走一层开销可忽略\n\n- 数据库**90%场景是范围查询**，单点查询优势完全被抵消\n\n### 4\\. B\\+树磁盘预读性更好\n\n磁盘局部性原理：读取一页数据时，系统会预读后续页。\n\nB\\+树叶子节点**有序连续**，预读命中率极高；B树数据分散，预读基本失效。\n\n## 六、总结：为什么 MySQL 选 B\\+树而不是 B树？\n\n1. **树高更低，磁盘IO更少**：非叶子不存数据，索引密度极高；\n\n2. **完美支持范围查询、排序、分页**：叶子链表结构天然适配SQL场景；\n\n3. **磁盘预读效率高**：有序连续存储，贴合磁盘局部性原理；\n\n4. **查询性能稳定**：所有查询最终都走叶子节点，时间复杂度统一；\n\n5. **增删更稳定**：数据仅在叶子变动，非叶子索引调整开销小。\n\n## 七、极简面试背诵版\n\n**B树**：所有节点存数据，树层高、IO多、范围查询弱，适合纯单点查找。\n\n**B\\+树**：非叶子只索引、叶子存数据且链表串联，树极矮、IO极少、范围查询无敌，是数据库索引最优解。","markdown",2122,{"frontmatter":49,"meta":50,"nodes":89},{},{"title":43,"description":51,"toc":52},"B树（多路平衡查找树）与 B+树（B树的优化变种）是磁盘数据库、索引结构的核心底层数据结构。MySQL、InnoDB、文件系统均采用 B+树而非 B树，核心原因是 B+树更适配磁盘IO特性。本文用通俗语言、对比维度、场景差异，彻底讲透二者区别。",{"title":4,"searchDepth":53,"depth":53,"links":54},5,[55,57,60,63,66,83,86],{"id":4,"depth":42,"text":56},"一、前置核心认知",{"id":58,"depth":42,"text":59},"b","二、B树（多路平衡查找树）原理",{"id":61,"depth":42,"text":62},"b-1","三、B+树（增强多路平衡树）原理",{"id":64,"depth":42,"text":65},"bb-1","四、B树与B+树 全方位核心区别（重点）",{"id":67,"depth":42,"text":68,"children":69},"-1","五、关键细节深度解读（面试高频）",[70,74,77,80],{"id":71,"depth":72,"text":73},"-_1-b",3,"1. 为什么 B+树 树高极低？",{"id":75,"depth":72,"text":76},"-_2","2. 为什么数据库需要范围查询？",{"id":78,"depth":72,"text":79},"-_3-b","3. B树单点查询真的更快吗？",{"id":81,"depth":72,"text":82},"-_4-b","4. B+树磁盘预读性更好",{"id":84,"depth":42,"text":85},"mysql-b-b","六、总结：为什么 MySQL 选 B+树而不是 B树？",{"id":87,"depth":42,"text":88},"-2","七、极简面试背诵版",[90,94,103,106,113,120,127,129,134,162,168,170,175,208,218,220,374,376,379,382,389,396,398,406,417,419,422,425,437,439,442,449,451,484,486,492],[91,92,43],"h1",{"id":93},"bb",[95,96,97,98,102],"p",{},"B树（多路平衡查找树）与 B+树（B树的优化变种）是",[99,100,101],"strong",{},"磁盘数据库、索引结构","的核心底层数据结构。MySQL、InnoDB、文件系统均采用 B+树而非 B树，核心原因是 B+树更适配磁盘IO特性。本文用通俗语言、对比维度、场景差异，彻底讲透二者区别。",[104,105,56],"h2",{"id":4},[95,107,108,109,112],{},"1. 二叉树、AVL、红黑树",[99,110,111],{},"不适合磁盘存储","：树层高、IO次数多，磁盘寻道开销极大；",[95,114,115,116,119],{},"2. B\u002FB+树是",[99,117,118],{},"多路平衡树","，矮、胖、层数极少，最大限度减少磁盘IO；",[95,121,122,123,126],{},"3. 磁盘读写最小单位是 ",[99,124,125],{},"页（Page）","，InnoDB 默认一页 16KB，B+树节点与磁盘页对齐。",[104,128,59],{"id":58},[95,130,131],{},[99,132,133],{},"核心特点：所有节点都存【索引key + 数据data + 子节点指针】",[135,136,137,144,150,156],"ul",{},[138,139,140,143],"li",{},[99,141,142],{},"非叶子节点","：存key、数据、子节点指针，可直接命中数据",[138,145,146,149],{},[99,147,148],{},"叶子节点","：同样存储完整key和数据，所有叶子节点无有序链表连接",[138,151,152,155],{},[99,153,154],{},"平衡性","：所有叶子节点高度一致，天然平衡",[138,157,158,161],{},[99,159,160],{},"查找规则","：从根节点逐层比对key，命中即返回，无需走到叶子",[95,163,164,167],{},[99,165,166],{},"致命缺点","：每个节点存储数据，单页存储key数量少 → 树层高变高 → 磁盘IO变多，范围查询极差。",[104,169,62],{"id":61},[95,171,172],{},[99,173,174],{},"核心特点：非叶子只存索引，叶子存全部数据 + 有序双向链表",[135,176,177,187,197,203],{},[138,178,179,182,183,186],{},[99,180,181],{},"非叶子节点（索引层）","：",[99,184,185],{},"只存key和子节点指针，不存data数据","，仅用于路由检索",[138,188,189,192,193,196],{},[99,190,191],{},"叶子节点（数据层）","：存储",[99,194,195],{},"全部key + 完整数据","，整棵树所有数据都在叶子",[138,198,199,202],{},[99,200,201],{},"有序链表","：所有叶子节点按key从小到大串联成双向链表",[138,204,205,207],{},[99,206,154],{},"：全程平衡，树高极低",[95,209,210,213,214,217],{},[99,211,212],{},"核心优势","：索引节点极小、存储key极多、树高极低、",[99,215,216],{},"范围查询无敌","。",[104,219,65],{"id":64},[221,222,223,239],"table",{},[224,225,226],"thead",{},[227,228,229,233,236],"tr",{},[230,231,232],"th",{},"对比维度",[230,234,235],{},"B 树",[230,237,238],{},"B+ 树",[240,241,242,262,275,291,304,320,333,346,359],"tbody",{},[227,243,244,250,256],{},[245,246,247],"td",{},[99,248,249],{},"数据存储位置",[245,251,252,253],{},"非叶子、叶子节点",[99,254,255],{},"都存数据",[245,257,258,261],{},[99,259,260],{},"仅叶子节点存数据","，非叶子只存索引key",[227,263,264,269,272],{},[245,265,266],{},[99,267,268],{},"单节点存储容量",[245,270,271],{},"小（存数据占用大量空间）",[245,273,274],{},"极大（只存key，一页可存成千上万个索引）",[227,276,277,282,285],{},[245,278,279],{},[99,280,281],{},"树的高度",[245,283,284],{},"较高",[245,286,287,290],{},[99,288,289],{},"极低","（千万级数据仅3~4层）",[227,292,293,298,301],{},[245,294,295],{},[99,296,297],{},"单点查询IO",[245,299,300],{},"可能更快（中途命中）",[245,302,303],{},"略慢（必须走到叶子节点）",[227,305,306,311,314],{},[245,307,308],{},[99,309,310],{},"范围查询能力",[245,312,313],{},"极差，需要多次遍历、回溯",[245,315,316,319],{},[99,317,318],{},"极强","，叶子链表直接遍历，无需回溯",[227,321,322,327,330],{},[245,323,324],{},[99,325,326],{},"叶子节点结构",[245,328,329],{},"无序、无链表连接",[245,331,332],{},"有序双向链表串联",[227,334,335,340,343],{},[245,336,337],{},[99,338,339],{},"重复key处理",[245,341,342],{},"分散存储",[245,344,345],{},"非叶子冗余存储，叶子唯一完整存储",[227,347,348,353,356],{},[245,349,350],{},[99,351,352],{},"磁盘IO效率",[245,354,355],{},"低，树层高、IO次数多",[245,357,358],{},"极高，树层极低、预读命中率高",[227,360,361,366,369],{},[245,362,363],{},[99,364,365],{},"适配场景",[245,367,368],{},"少量单次查询、内存索引",[245,370,371],{},[99,372,373],{},"数据库索引、文件系统",[104,375,68],{"id":67},[377,378,73],"h3",{"id":71},[95,380,381],{},"B树每个节点要存【key+数据+指针】，数据占用空间大，一页能存的key数量少；",[95,383,384,385,388],{},"B+树非叶子节点",[99,386,387],{},"只存key和指针","，无数据冗余，单页可存储数千个索引key，分支度极大，树被压得极矮。",[95,390,391,392,395],{},"举例：16KB页，key为8字节主键，千万级数据 B+树仅需",[99,393,394],{},"3层","，最多3次磁盘IO即可查到数据。",[377,397,76],{"id":75},[95,399,400,401,405],{},"SQL 中 ",[402,403,404],"code",{},"between、>、\u003C、like、order by"," 全是范围查询：",[135,407,408,411],{},[138,409,410],{},"B树：范围查询需要中序遍历，频繁回溯上层节点，IO爆炸",[138,412,413,414],{},"B+树：找到起始叶子节点，直接顺着链表向后遍历，",[99,415,416],{},"一次IO批量读取",[377,418,79],{"id":78},[95,420,421],{},"理论上是：B树非叶子可直接命中返回，不用走到叶子；",[95,423,424],{},"但工程上几乎无影响：",[135,426,427,430],{},[138,428,429],{},"B+树树高极低，多走一层开销可忽略",[138,431,432,433,436],{},"数据库",[99,434,435],{},"90%场景是范围查询","，单点查询优势完全被抵消",[377,438,82],{"id":81},[95,440,441],{},"磁盘局部性原理：读取一页数据时，系统会预读后续页。",[95,443,444,445,448],{},"B+树叶子节点",[99,446,447],{},"有序连续","，预读命中率极高；B树数据分散，预读基本失效。",[104,450,85],{"id":84},[452,453,454,460,466,472,478],"ol",{},[138,455,456,459],{},[99,457,458],{},"树高更低，磁盘IO更少","：非叶子不存数据，索引密度极高；",[138,461,462,465],{},[99,463,464],{},"完美支持范围查询、排序、分页","：叶子链表结构天然适配SQL场景；",[138,467,468,471],{},[99,469,470],{},"磁盘预读效率高","：有序连续存储，贴合磁盘局部性原理；",[138,473,474,477],{},[99,475,476],{},"查询性能稳定","：所有查询最终都走叶子节点，时间复杂度统一；",[138,479,480,483],{},[99,481,482],{},"增删更稳定","：数据仅在叶子变动，非叶子索引调整开销小。",[104,485,88],{"id":87},[95,487,488,491],{},[99,489,490],{},"B树","：所有节点存数据，树层高、IO多、范围查询弱，适合纯单点查找。",[95,493,494,497],{},[99,495,496],{},"B+树","：非叶子只索引、叶子存数据且链表串联，树极矮、IO极少、范围查询无敌，是数据库索引最优解。"]