同样是 B+Tree,为什么 SQLite、PostgreSQL 和 InnoDB 的实现不同?
数据库真正有意思的地方并不是“知道它用了 BTree”而是同一种数据结构为什么不同数据库会做出完全不同的实现上次我们认识了 BTree。今天开始从“数据结构”进入“数据库实现”。我们重点比较三个非常经典的数据库SQLitePostgreSQLMySQL InnoDB它们都大量使用 B-Tree 家族索引但存储模型并不一样。一、先看一个最重要的问题假设有一张表User id name age 1 张三 20 2 李四 25 3 王五 30现在SELECT*FROMUserWHEREid2;数据库最终必须完成一件事情找到id 2对应的数据但这里存在两种完全不同的设计。设计 A索引只保存“数据在哪里”例如BTree 2 | ↓ Page 10 Slot 3找到Page 10 Slot 3然后再去读取真正的数据。也就是Index ↓ Record Location ↓ Data设计 B索引本身就是数据例如BTree 2 | ↓ ------------- | id2 | | name李四 | | age25 | -------------找到索引节点数据本身也就找到了。这两个设计看起来只是一个小区别。实际上它会影响整个数据库的存储结构查询路径主键性能二级索引更新方式Page 组织磁盘空间Buffer Pool 使用而 SQLite、PostgreSQL、InnoDB 恰好体现了不同的设计思想。二、SQLiteB-Tree 就是数据组织的核心先看最简单、最紧凑的 SQLite。SQLite 与 MySQL、PostgreSQL 最大的不同之一它不是一个独立的数据库服务器。它通常直接嵌入应用程序Application | ↓ SQLite | ↓ database.db数据库本身就是一个文件。三、SQLite 的核心B-Tree PageSQLite 内部大量数据都组织在 B-Tree 中。可以简单理解成Database File --------- | Page 1 | --------- | Page 2 | --------- | Page 3 | --------- | Page 4 | ---------这些 Page 并不是简单的数据块。它们可以作为B-Tree Internal Page或者B-Tree Leaf PageSQLite 的一个重要特点SQLite 的表本身可以组织成一种 B-Tree。例如Table B-Tree Root | ---------- | | Page A Page B | | Records Records因此 SQLite 的存储模型相对紧凑。它没有简单地采用Heap Separate Primary Index这种模型。四、SQLite 为什么适合这样设计因为 SQLite 的目标非常明确小型、可靠、嵌入式、零配置。它需要一个文件一个进程很少的后台组件尽可能简单的部署方式所以 SQLite 的存储设计非常集中。你可以把它理解为SQLite | -- B-Tree | -- Pager | -- WAL预写日志 | -- File它的很多数据库能力最终都会落到这个文件和 Page 管理体系上。五、PostgreSQL数据和索引分开接下来来看 PostgreSQL。它采用了一个非常重要的设计表数据和索引通常是分开的。例如Table | ↓ Heap | -- Page 0 -- Page 1 -- Page 2另外Index | ↓ B-Tree | -- Index Page -- Index Page -- Index Page两者是独立的。六、PostgreSQL 的索引保存什么假设User id100 name张三Heap 中Page 5 ---------------- | Tuple | | id100 | | name张三 | ----------------B-Tree 索引中100 | ↓ Tuple Location这个位置通常通过**TIDTuple Identifier**来定位。可以把它理解为TID | -- Block Number | -- Tuple Offset也就是Index | ↓ 某个 Heap Page | ↓ 某条 Tuple七、为什么 PostgreSQL 要这样设计因为 PostgreSQL 的设计非常强调表数据本身的独立性。一张表可以拥有多个索引Table | Heap / | \ / | \ ↓ ↓ ↓ Index1 Index2 Index3例如PRIMARY KEY(id) INDEX(name) INDEX(age) INDEX(email)这些索引都指向Heap Tuple因此 PostgreSQL 可以非常灵活地增加不同类型的索引。八、这带来一个重要问题Index Scan 不是终点假设SELECT*FROMUserWHEREid100;PostgreSQLSQL ↓ B-Tree Index ↓ TID ↓ Heap Page ↓ Tuple因此一次查询可能至少涉及Index Page Heap Page这被称为Index Scan Heap Fetch这也是 PostgreSQL 查询性能分析中非常重要的一件事情。九、InnoDB完全不同的思路现在进入 MySQL 的 InnoDB。这里是今天最重要的部分。InnoDB 使用Clustered Index聚簇索引作为表数据的核心组织方式。十、什么叫 Clustered Index假设User id name 1 张三 2 李四 3 王五InnoDB 可以把主键 BTree 组织成Root | [1 | 2 | 3] | ↓ ------------------------- | id1 | 张三 | | id2 | 李四 | | id3 | 王五 | -------------------------叶子节点不只是索引。而是直接保存整行数据。所以Primary Key | ↓ Clustered BTree | ↓ Row Data这就是聚簇索引。十一、为什么 InnoDB 要这么做核心目标之一让主键访问非常高效。例如SELECT*FROMUserWHEREid100;InnoDBRoot ↓ Internal Page ↓ Leaf Page ↓ Row到了 Leaf Page数据已经在那里不需要再Index ↓ Heap ↓ Tuple多走一步。十二、三种数据库放在一起现在我们可以画出一张非常重要的图。SQLiteB-Tree | ↓ Table DataPostgreSQLB-Tree Index | ↓ TID | ↓ Heap | ↓ TupleInnoDBPrimary Key BTree | ↓ Row Data十三、那么二级索引呢这里 InnoDB 又出现一个非常有意思的设计。假设PRIMARY KEY(id) INDEX(name)主键索引id ↓ 完整Row但是name索引不能直接保存整行否则每个二级索引都会非常巨大。因此二级索引通常保存name Primary Key例如name Index 张三 → id100 李四 → id200 王五 → id300查询SELECT*FROMUserWHEREname李四;路径Secondary Index | ↓ Primary Key | ↓ Clustered Index | ↓ Row于是发生了第二次 BTree 查询。这个过程通常被称为回表Table Lookup十四、三种数据库的核心差异现在可以正式比较特性SQLitePostgreSQLInnoDB数据组织B-TreeHeapClustered BTree主键索引B-Tree结构独立索引聚簇索引索引与数据高度融合分离主键融合二级索引依实现而定指向Heap Tuple指向主键查询路径B-TreeIndex → HeapClustered Index设计倾向简洁、嵌入式灵活、扩展性OLTP、高效主键访问这里最重要的不是记住表格。而是理解BTree 只是工具真正决定数据库行为的是“BTree 数据组织方式”。十五、为什么 PostgreSQL 的 Heap 不像 InnoDB 那样直接放到 BTree这是一个非常值得思考的问题。如果把数据直接放进 BTreeBTree | -- Row -- Row -- Row看起来非常高效。但是数据的位置与主键绑定得更加紧密。而 PostgreSQLHeap | -- Tuple -- Tuple -- Tuple Index | -- Index -- Index数据和索引相对独立这样做可以带来更大的灵活性。例如一张表可以拥有B-Tree Hash GiST GIN BRIN等不同索引类型。它们都可以针对同一份 Heap 数据。十六、为什么数据库没有一种“完美”的索引设计因为数据库面临的需求不同。如果目标是主键查询极快。Clustered Index 非常优秀。如果目标是一个表需要多个不同类型的索引。Heap Index 非常灵活。如果目标是极简、单文件、嵌入式。SQLite 的设计非常合适。所以数据库设计 ≠ 寻找最优秀的数据结构 数据库设计 针对目标场景做权衡这是整个数据库内核学习过程中非常重要的思想。十七、再看一个更新问题假设id100 name张三现在UPDATEUserSETnameAlexanderWHEREid100;如果新的数据长度发生变化张三变成Alexander数据可能无法继续放在原来的空间。这时候数据库需要考虑原位置是否足够是否需要移动 Tuple是否产生空闲空间索引是否需要更新其他事务看到什么版本于是**存储结构开始与事务系统产生联系。**这就是下一阶段非常重要的内容。十八、应该建立的知识体系我们已经从Database走到了Database | ↓ Storage Engine | ↓ Page | ↓ Data Organization | ├── Heap | └── BTree | ↓ Index而现在又进一步发现BTree | ── SQLite | ── PostgreSQL | └── InnoDB虽然名字相似B-Tree / BTree但是背后的数据组织方式完全可以不同。十九、重要的三个结论① Index 不等于 DataPostgreSQL 中Index → Heap → Tuple索引只是定位工具。② Clustered Index 可以同时承担 Data IndexInnoDBBTree ↓ Row索引本身就是数据组织结构。③ 数据库设计的核心不是“选择哪个算法”而是根据访问模式、数据规模、写入方式、事务需求和硬件特性决定数据应该如何组织。

相关新闻

数组数据结构全解析:从内存模型到多语言实现与性能优化

数组数据结构全解析:从内存模型到多语言实现与性能优化

在实际编程中,无论是处理用户数据、解析文件内容,还是进行复杂的数学计算,我们几乎每天都在与数组打交道。数组是计算机科学中最基础、最核心的数据结构之一,它提供了一种在连续内存空间中存储和管理同类型数据集合的有效方式。理…

2026/8/25 18:34:34 阅读更多 →
来日照游玩吃海鲜,美香酒店地道渔家好味

来日照游玩吃海鲜,美香酒店地道渔家好味

在山东日照,任家台海滨以其秀丽的自然风光和丰富的海洋资源,成为了旅游爱好者们的热门目的地。这里,金色的沙滩在阳光的照耀下闪耀着光芒,湛蓝的海水与天空相接,还有那形态各异的礁石默默诉说着大海的故事。在这里&…

2026/8/25 18:34:34 阅读更多 →
情绪热点、人格两面性与情境开关:一场关于人性的社会实验

情绪热点、人格两面性与情境开关:一场关于人性的社会实验

——当我们把人放进不同场景,哪一面会被唤醒?📌 本文为心理学科普,基于公开的社会心理学研究整理,仅用于启发自我觉察与理解他人,不构成任何心理诊断、专业咨询意见,也不传授操纵他人的方法。如…

2026/8/26 20:59:56 阅读更多 →

最新新闻

Milvus 2.6 向量数据库搭建 RAG 知识库问答系统实战

Milvus 2.6 向量数据库搭建 RAG 知识库问答系统实战

在实际项目中搭建知识库问答系统时,Milvus 是绕不开的开源向量数据库选项之一。以 Milvus 2.6 作为向量存储层,搭配 RAG(Retrieval-Augmented Generation,检索增强生成)流程,可以实现从文档切片、向量化、相…

2026/8/26 21:00:17 阅读更多 →
Nemotron-3-Ultra部署实战:vLLM/SGLang/TRT-LLM三大引擎避坑指南

Nemotron-3-Ultra部署实战:vLLM/SGLang/TRT-LLM三大引擎避坑指南

1. 项目概述:为什么这个指南值得你花两小时认真读完 NVIDIA Nemotron-3-Ultra不是普通的大模型——它是NVIDIA官方发布的、专为强化学习对战(RLHF对抗训练)、模型蒸馏与合成数据生成而深度优化的“教练型”模型。它不主打通用对话&#xff0c…

2026/8/26 21:00:17 阅读更多 →
生物多样性评估实战:从数学建模到SPSSPRO应用全解析

生物多样性评估实战:从数学建模到SPSSPRO应用全解析

1. 从一道赛题到一套方法:生物多样性评估的实战拆解 如果你在搜索引擎里找过“数学建模”、“生物多样性评估”或者“SPSSPRO”,大概率会看到2011年认证杯数学建模B题(第二阶段)的身影。这道题之所以能成为经典,甚至十…

2026/8/26 21:00:17 阅读更多 →
数位DP实战:从蓝桥杯真题解析二进制问题与通用框架

数位DP实战:从蓝桥杯真题解析二进制问题与通用框架

1. 项目概述:从一道国赛真题看数位DP的实战拆解最近在复盘蓝桥杯国赛的历年真题,2021年那道关于“二进制问题”的题目,可以说是数位动态规划(Digit DP)一个非常经典的练兵场。很多朋友初次接触数位DP时,总觉…

2026/8/26 20:59:16 阅读更多 →
AI与区块链融合:xAI招聘加密金融专家的技术深意

AI与区块链融合:xAI招聘加密金融专家的技术深意

1. 马斯克xAI招聘加密专家的深层信号 2024年2月,埃隆马斯克旗下的人工智能公司xAI发布了一则看似普通的招聘信息——招募"加密金融专家"。但当我们拆解这个岗位的职责描述时,会发现这实际上标志着AI与区块链技术融合进入了一个全新阶段。这个岗…

2026/8/26 20:59:16 阅读更多 →
2026版软件测试面试题解析与实战技巧

2026版软件测试面试题解析与实战技巧

1. 软件测试面试题的价值与定位在技术岗位求职过程中,面试题库就像游戏玩家的装备库,准备得越充分,通关的可能性就越大。作为从业十余年的测试工程师,我整理过不下20个版本的面试题库,深知一套好的面试题对求职者和面试…

2026/8/26 20:59:14 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →