2026-10-18 07:40:22
PostgreSQL的逻辑存储层级包含数据库、模式(schema)及其内部对象,物理存储通过目录、文件和表空间实现,并采用TOAST策略处理大字段。 以下是具体说明:
1. PG数据组织(逻辑包含关系)template0:不可修改,用于系统恢复,确保系统表结构不被意外更改。
template1:作为用户创建新数据库的模板,可定制表和组件(如预装扩展),新建库会继承其内容。
postgres:默认可直接使用的数据库,无特殊功能,可通过psql连接后用l查看所有库,c 库名切换数据库。
命名空间隔离: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名,则报错。
base:存储用户数据库数据,每个数据库对应一个子目录(目录名为数据库OID)。
global:存储集群级元数据(如用户、表空间定义),由pg_global表空间管理。
pg_tblspc:存储用户自定义表空间的符号链接,指向实际存储路径(如/mnt/ssd)。
pg_wal:存储预写式日志(WAL),用于崩溃恢复和流复制。
pg_xact:存储事务状态数据(如提交/中止信息)。
默认表空间:
pg_default:映射到$PGDATA/base/,存储用户表和索引。
pg_global:映射到$PGDATA/global/,存储集群级数据。
自定义表空间:通过CREATE TABLESPACE fast_space LOCATION '/mnt/ssd';创建,实际路径通过符号链接管理。
冷热数据分离:将热数据(频繁访问)存储在SSD表空间,冷数据(归档)存储在SATA表空间,平衡性能与成本。
Main Fork:存储表和索引的实际数据,文件按1GB分割为segment文件(如12345.1),避免大文件兼容性问题。
Free Space Map(FSM):记录数据页内空闲空间位置,通过VACUUM回收无用数据后更新,加速空间复用。
Visibility Map(VM):标记数据页是否全部可见(无需MVCC检查),减少扫描时的可见性判断开销。
默认大小:8KB(编译时可配置为16KB或32KB),包含页头、行数据和空闲空间。
行存储限制:单行数据超过页大小时需启用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策略解决大字段存储问题。这种设计兼顾了灵活性、性能与可维护性。