跳到主要内容
DevOpsMar 28, 2026

Deep EVM #25:PostgreSQL表分区——当你的表超过1000万行

OS
Open Soft Team

Engineering Team

何时需要分区

当表行数超过1000万时,查询性能开始下降。PostgreSQL的表分区将大表分成更小的物理片段,同时保持逻辑上的统一视图。

分区类型

范围分区

按时间范围最常见,适合时序数据:

CREATE TABLE transactions (
    id BIGSERIAL,
    created_at TIMESTAMPTZ NOT NULL,
    amount NUMERIC
) PARTITION BY RANGE (created_at);

CREATE TABLE transactions_2024_q1
    PARTITION OF transactions
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

列表分区

按离散值分区:

CREATE TABLE orders (
    id BIGSERIAL,
    region TEXT NOT NULL,
    total NUMERIC
) PARTITION BY LIST (region);

哈希分区

均匀分布数据:

CREATE TABLE events (
    id BIGSERIAL,
    user_id BIGINT NOT NULL
) PARTITION BY HASH (user_id);

迁移策略

将现有大表迁移到分区表需要仔细规划:

  1. 创建新的分区表
  2. 分批复制数据
  3. 切换表名
  4. 验证数据完整性

性能影响

分区表在适当查询下可以将性能提升10-100倍,因为分区剪枝允许PostgreSQL只扫描相关分区。

总结

表分区是PostgreSQL处理大数据量的核心工具。选择正确的分区策略并配合适当的索引,可以使数据库在数亿行数据下仍然保持高性能。