PostgreSQL技术内幕3:PG逻辑存储层级和物理存储结构

PostgreSQL技术内幕3:PG逻辑存储层级和物理存储结构
最新回答
久疚

2026-10-18 07:40:22

PostgreSQL的逻辑存储层级包含数据库、模式(schema)及其内部对象,物理存储通过目录、文件和表空间实现,并采用TOAST策略处理大字段。 以下是具体说明:

1. PG数据组织(逻辑包含关系)
  • 数据库初始化与默认数据库PostgreSQL初始化时默认创建三个数据库:

    template0:不可修改,用于系统恢复,确保系统表结构不被意外更改。

    template1:作为用户创建新数据库的模板,可定制表和组件(如预装扩展),新建库会继承其内容。

    postgres:默认可直接使用的数据库,无特殊功能,可通过psql连接后用l查看所有库,c 库名切换数据库。

  • Schema(模式)的作用与管理

    命名空间隔离:Schema是数据库内的命名空间,避免同名对象冲突(如不同schema可存在同名表)。

    创建与查看:通过CREATE SCHEMA testschema;创建,SELECT schema_name FROM information_schema.schemata;查看所有schema。

    内置schema:

    pg_catalog:存储系统表(如pg_class记录表描述信息)、索引、内置类型和函数。

    information_schema:提供标准SQL元数据视图(如表结构、权限)。

    pg_toast:存储大字段的溢出数据(详见TOAST策略)。

    对象查找规则:通过search_path参数指定schema优先级(逗号分隔),未指定时默认搜索$user,public。若未匹配且未显式指定schema名,则报错。

2. 存储目录与文件布局
  • 目录结构与功能PostgreSQL的物理存储目录以$PGDATA(如/var/lib/postgresql/12/main)为根,主要子目录包括:

    base:存储用户数据库数据,每个数据库对应一个子目录(目录名为数据库OID)。

    global:存储集群级元数据(如用户、表空间定义),由pg_global表空间管理。

    pg_tblspc:存储用户自定义表空间的符号链接,指向实际存储路径(如/mnt/ssd)。

    pg_wal:存储预写式日志(WAL),用于崩溃恢复和流复制。

    pg_xact:存储事务状态数据(如提交/中止信息)。

  • 表空间(Tablespace)机制

    默认表空间:

    pg_default:映射到$PGDATA/base/,存储用户表和索引。

    pg_global:映射到$PGDATA/global/,存储集群级数据。

    自定义表空间:通过CREATE TABLESPACE fast_space LOCATION '/mnt/ssd';创建,实际路径通过符号链接管理。

    冷热数据分离:将热数据(频繁访问)存储在SSD表空间,冷数据(归档)存储在SATA表空间,平衡性能与成本。

3. 文件布局与页管理
  • 文件类型与作用

    Main Fork:存储表和索引的实际数据,文件按1GB分割为segment文件(如12345.1),避免大文件兼容性问题。

    Free Space Map(FSM):记录数据页内空闲空间位置,通过VACUUM回收无用数据后更新,加速空间复用。

    Visibility Map(VM):标记数据页是否全部可见(无需MVCC检查),减少扫描时的可见性判断开销。

  • 页(Page)结构

    默认大小:8KB(编译时可配置为16KB或32KB),包含页头、行数据和空闲空间。

    行存储限制:单行数据超过页大小时需启用TOAST策略。

4. 页内数据存储与TOAST策略
  • TOAST(The Oversized-Attribute Storage Technique)当元组(行)数据超过页大小时,PostgreSQL自动启用TOAST,将大字段拆分为多个块存储在溢出表(pg_toast_<表OID>)中。

  • TOAST策略类型

    PLAIN:禁止压缩和行外存储,仅适用于无需TOAST的小数据类型(如int4)。

    EXTENDED(默认):优先压缩,若仍超限则行外存储,平衡空间与性能。

    EXTERNAL:允许行外存储但不压缩,适用于需快速随机访问的字段(如大文本的子串查询)。

    MAIN:优先压缩并尽量不行外存储,适用于可压缩且需减少I/O的场景。

  • TOAST触发条件

    插入或更新时,若行总大小超过TOAST_TUPLE_THRESHOLD(默认2KB),则触发TOAST处理。

    单个字段超过TOAST_ATTRIBUTE_THRESHOLD(默认2KB)时,即使行总大小未超限也会触发。

总结:PostgreSQL通过逻辑层级(数据库→schema→对象)实现隔离,物理存储采用目录分类和表空间机制管理数据文件,并通过FSM、VM优化页空间利用,最终依赖TOAST策略解决大字段存储问题。这种设计兼顾了灵活性、性能与可维护性。