当前位置: 首页 > news >正文

PostgreSQL存储的简单总结

PostgreSQL是一个强大的开源关系型数据库,它的存储格式设计得非常灵活,能够支持多种数据类型和复杂的查询操作。以下是PostgreSQL的存储格式的详细介绍,包括它的表、数据行、索引以及存储方式。

1. 表的物理存储

在PostgreSQL中,表的数据存储在磁盘上的文件中。每个表对应于数据库目录中的一个或多个文件。文件的存储格式和结构如下:

  • 堆表(Heap Table)
    PostgreSQL使用堆文件存储表的数据。每个表的数据按照块(block,默认大小为8KB)的形式存储。每个块包含多条数据行,这些行存储在块的一个连续区域内。

  • 表空间
    表空间(tablespace)是一种逻辑上的概念,用于组织表和索引文件。可以通过表空间把不同的表和索引存储在不同的磁盘位置,以便进行更好的I/O性能优化。

2. 数据行的存储格式

每一行数据由多个字段组成,不同字段的数据类型不同,PostgreSQL根据字段类型存储数据。数据行由以下几个部分组成:

  • 行头(Header)
    每一行数据都有一个行头(row header),用于存储元数据。行头包含的信息有:

    • xmin:创建该行的事务ID。
    • xmax:删除该行的事务ID(如果存在)。
    • 行的长度信息。
    • 行的指针和标识符信息。
  • 实际数据(Tuple Data)
    行的实际数据紧跟在行头之后存储。PostgreSQL会对不同的数据类型使用不同的存储格式。例如:

    • 对于整数,直接存储二进制格式。
    • 对于字符串,采用长度前缀的形式存储(以字节为单位)。
    • 对于可变长度的字段(如 TEXTVARCHAR),PostgreSQL将其压缩存储。

3. TOAST(The Oversized-Attribute Storage Technique)机制

PostgreSQL采用TOAST机制来处理超大数据。默认情况下,如果数据行中某个字段的数据超过一定大小(默认是2KB),PostgreSQL会将该字段的内容压缩并存储在一个独立的TOAST表中,只在主表中保留引用指针。这使得主表的行大小保持合理,提升了性能。

4. MVCC(多版本并发控制)

PostgreSQL通过多版本并发控制(MVCC)来支持事务,并且实现了行级并发控制。数据库中的每一行数据都有多个版本,每个版本由不同的事务创建。MVCC存储的关键点如下:

  • 每一行数据都包含事务ID(xminxmax)来跟踪该行的创建和删除时间。
  • 旧的行版本不会立即删除,只有在没有其他事务引用它们时才会被清理(通过VACUUM进程)。这允许多个事务同时访问表数据,而不会相互阻塞。

5. 索引的存储格式

PostgreSQL支持多种索引类型,常见的索引类型有B树、哈希、GiST和GIN等。不同的索引类型具有不同的存储格式和特性:

  • B树索引
    B树索引是PostgreSQL中最常用的索引类型,它按顺序存储索引键,适合范围查询和精确匹配。

  • 哈希索引
    哈希索引基于哈希表结构,适合基于等值条件的查询。

  • GiST 和 GIN 索引
    这些索引类型用于处理复杂数据类型(如文本搜索、地理数据、数组等),它们使用特殊的存储格式来加速复杂查询。

6. 数据文件的组织方式

  • 每个表和索引都有一个唯一的OID(对象ID),数据文件名就是该表或索引的OID。
  • 每个表和索引的存储由多个文件组成,当文件大小达到1GB时,PostgreSQL会生成新的文件并继续存储数据。

7. WAL(Write-Ahead Logging)机制

PostgreSQL使用WAL机制来保证数据的可靠性和一致性。WAL日志会记录数据修改操作,以便在崩溃或断电的情况下能够进行数据恢复。WAL日志的内容包括插入、更新、删除操作的信息。

总结

PostgreSQL的存储格式设计合理且灵活,它使用堆存储数据行,并采用MVCC来支持事务隔离。对于大数据字段,PostgreSQL使用TOAST机制存储,并支持多种索引类型来优化查询性能。WAL日志则保证了数据的可靠性。

相关文章:

  • PHP安装后Apache无法运行的问题
  • 【每天学个新注解】Day 12 Lombok注解简解(十一)—@FieldDefaults(@NonFinal、@PackagePrivate)
  • C++随心记
  • Linux常用命令记录
  • (done) 声音信号处理基础知识(11) (Complex Numbers for Audio Signal Processing)
  • 重置linux后vscode无法再次使用ssh连接
  • 6.MySQL基本查询
  • Redis介绍及整合Spring
  • 超分辨率重构论文集合
  • [网络]抓包工具介绍 tcpdump
  • xtu oj 六边形
  • flume系列之:flume jmx页面导出flume、java进程等全部指标
  • 深入理解网络通信: 长连接、短连接与WebSocket
  • 小米2025届软件开发工程师(C/C++/Java)(编程题AK)
  • OpenCV-指纹识别
  • python3.6+scrapy+mysql 爬虫实战
  • Android优雅地处理按钮重复点击
  • canvas 绘制双线技巧
  • iOS | NSProxy
  • JS专题之继承
  • Logstash 参考指南(目录)
  • Next.js之基础概念(二)
  • PHP那些事儿
  • Python_OOP
  • socket.io+express实现聊天室的思考(三)
  • Unix命令
  • 编写符合Python风格的对象
  • 代理模式
  • 读懂package.json -- 依赖管理
  • 高度不固定时垂直居中
  • 前端
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • # Redis 入门到精通(一)数据类型(4)
  • #if #elif #endif
  • #if 1...#endif
  • #stm32驱动外设模块总结w5500模块
  • (1)bark-ml
  • (4)Elastix图像配准:3D图像
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (Ruby)Ubuntu12.04安装Rails环境
  • (办公)springboot配置aop处理请求.
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)插入排序
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Core跨平台微服务学习资源
  • .net 使用ajax控件后如何调用前端脚本
  • .NET中使用Redis (二)