好的,阿杰,我们来系统梳理一下 PostgreSQL 的表空间(Tablespace),包括概念、用途、管理方法和实践操作。


🧩 PostgreSQL 表空间详解


一、概念

  • 表空间(Tablespace) 是 PostgreSQL 用来 管理数据库对象存储位置 的逻辑抽象。
  • 简单理解:
    • 默认情况下,所有数据库对象(表、索引等)存放在 默认表空间 pg_default
    • 通过创建自定义表空间,可以将不同数据库对象存储在不同磁盘或目录上

二、表空间的作用

  1. 分散 I/O 压力
    • 将大表、索引放到不同磁盘,提高读写性能
  2. 灵活存储管理
    • 不同表空间可以位于不同文件系统或磁盘分区
  3. 支持大数据存储
    • 避免单个磁盘空间不足
  4. 备份与迁移方便
    • 可以单独备份或迁移表空间

三、默认表空间

表空间名说明
pg_default默认表空间,普通表和索引默认存储位置
pg_global存储全局对象,例如全局序列(Global Sequence)
自定义表空间用户创建的表空间,可以指定目录

四、表空间的目录结构

  • 表空间对应操作系统目录:
    • Linux 示例: /var/lib/pgsql/15/data/base/ # pg_default /pgdata/tablespace/myspace/ # 自定义表空间
  • PostgreSQL 内部通过 OID 关联数据库对象和表空间目录

五、创建表空间

-- 创建一个表空间
CREATE TABLESPACE fastspace
OWNER postgres
LOCATION '/mnt/fastdisk/pgsql_tablespace';

说明:

  • OWNER → 表空间所有者
  • LOCATION → 操作系统目录路径(必须 PostgreSQL 服务器进程有读写权限)
  • 注意:目录必须为空且 PostgreSQL 用户可访问

六、创建对象指定表空间

1️⃣ 创建表时指定表空间

CREATE TABLE big_table (
    id SERIAL PRIMARY KEY,
    data TEXT
) TABLESPACE fastspace;

2️⃣ 创建索引时指定表空间

CREATE INDEX idx_big_table_data
ON big_table(data)
TABLESPACE fastspace;

如果不指定,表或索引将使用 pg_default


七、查看表空间

-- 查看所有表空间
\dT+             -- 查看类型信息
\db               -- 查看表空间
SELECT spcname, pg_tablespace_location(oid) AS location
FROM pg_tablespace;

输出示例:

spcnamelocation
pg_default
pg_global
fastspace/mnt/fastdisk/pgsql_tablespace

八、修改表空间

  • 移动表到新表空间
-- 移动表
ALTER TABLE big_table SET TABLESPACE fastspace;

-- 移动索引
ALTER INDEX idx_big_table_data SET TABLESPACE fastspace;

注意:

  • 移动表或索引会在后台复制数据 → 大表操作耗时较长
  • 不能移动系统表

九、删除表空间

DROP TABLESPACE fastspace;

注意:

  • 表空间内必须没有对象
  • 否则会报错

十、实践建议

  1. 大表或高 I/O 表放到单独磁盘的表空间
  2. 索引可以放到不同表空间,提高查询性能
  3. 系统表默认使用 pg_default,不要随意移动
  4. 定期监控表空间使用情况:
SELECT tablespace, pg_size_pretty(pg_tablespace_size(oid)) AS size
FROM pg_tablespace;


总结

  • 表空间 = 数据库对象的存储位置抽象
  • 默认表空间:pg_defaultpg_global
  • 可以创建自定义表空间,提高性能和存储灵活性
  • 可以单独为表或索引指定表空间,也可以移动已有对象