讲师中心 微信公众号
AI工具推荐 视频效率加速

postgresql索引文件结构如何设计_postgresql索引文件格式

千伟君_6245

千伟君_6245

发布时间:2025-11-25 16:26:33

|

973人浏览过

|

来源于php中文网

原创

PostgreSQL默认使用B-tree索引,基于8KB页组织,采用多层树结构,包含根、内部和叶节点,叶子节点同层且双向链接。页由页头、元组数组、空闲空间和特殊区域组成,页头含LSN、校验和等信息,元组存储键值与TID,支持压缩。插入删除触发分裂或清理,WAL保障一致性,结构统一支持多种索引类型。

postgresql索引文件结构如何设计_postgresql索引文件格式

PostgreSQL 使用 B-tree 作为默认索引类型,其索引文件结构基于磁盘页(Page)组织,每个页大小通常为 8KB。整个索引结构以多层级的树形方式存储,支持高效查找、插入和删除操作。

B-tree 索引整体结构

PostgreSQL 的 B-tree 索引由多个逻辑层级组成:根节点(Root)、中间节点(Internal Nodes)和叶节点(Leaf Nodes)。数据按键值有序排列,所有叶子节点位于同一层,并通过双向链表连接,便于范围扫描。

  • 根节点是查询入口,可能直接是叶子节点(当表很小)
  • 内部节点只存键值和子页指针,用于导航
  • 叶子节点包含实际的索引项:键值 + TID(指向表中行的物理位置)

索引页(Index Page)格式

每个索引页遵循统一的底层结构,由页头、元数据、元组数组和空闲空间组成。

用于自动切换项目中适合的node 版本
用于自动切换项目中适合的node 版本

根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。

下载
页头信息(PageHeaderData):
  • pd_lsn:记录最后一次修改该页的日志序列号(LSN)
  • pd_checksum:可选校验和,用于检测页损坏
  • pd_flags:标记页属性,如是否为叶子节点、根节点、删除状态等
  • pd_lower:指向页内数据起始位置(从下往上增长)
  • pd_upper:指向空闲空间起始位置
  • pd_special:指向特殊区域起始位置(B-tree 中为 IndexTupleData 结构数组)
  • pd_pagesize_version:页大小与版本号
  • pd_prune_xid:用于清理过期事务信息的最老 XID
元组数组区:
  • 从页底部向上存放 IndexTuple 结构
  • 每个 IndexTuple 包含:
    • 索引键值(Key Attributes)
    • TID(Table Page ID + Offset),指向堆表中的具体行
    • 额外标志位(如是否 NULL、是否压缩等)
    • t_info 字段记录长度和属性标志
空闲空间:
  • 位于页中部,由 pd_lower 和 pd_upper 界定
  • 新插入的索引项在此分配空间
  • 使用“反向填充”策略,提高空间利用率
特殊区域(Special Section):
  • B-tree 特有,位于页顶部,包含 BTreePageOpaqueData
  • 存储:
    • 左兄弟/右兄弟指针(用于叶子层遍历)
    • 父节点指针(非必须)
    • 层级编号(level,根为0,逐层递增)
    • 标志位(LEAF、ROOT、HALF_DEAD 等)

索引项(IndexTuple)结构细节

在 B-tree 中,IndexTuple 是基本存储单元,定义在 itup.h 中。

  • t_tid:指向表中行的 TID(BlockNumber + OffsetNumber)
  • t_info:包含长度、是否有NULL、是否有前缀压缩等标志
  • 键值部分:按索引定义顺序排列的 Datum 值,可能经过对齐或压缩
  • 支持前缀压缩(仅存与前一项不同的部分)和尾部压缩(去除重复后缀)

构建与维护机制

索引不是实时完全平衡的,而是通过写时复制(Copy-on-Write)和 WAL 日志保证一致性。

  • 插入时若页满,则触发分裂(Split):创建新页,重分布键值,更新父节点
  • 删除后标记为 DEAD,后续由 VACUUM 或 B-tree 内部清理机制回收空间
  • WAL 记录所有页变更,确保崩溃恢复后索引一致
  • 支持高级特性如部分索引、表达式索引、多列索引,其结构统一适配于上述框架
基本上就这些。PostgreSQL 的索引文件设计兼顾性能与可靠性,利用固定页结构和清晰的层次划分,实现高效的磁盘I/O和并发控制。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6167

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2608

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6167

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2608

2023.08.10

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 10.9万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 28.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn