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);
迁移策略
将现有大表迁移到分区表需要仔细规划:
- 创建新的分区表
- 分批复制数据
- 切换表名
- 验证数据完整性
性能影响
分区表在适当查询下可以将性能提升10-100倍,因为分区剪枝允许PostgreSQL只扫描相关分区。
总结
表分区是PostgreSQL处理大数据量的核心工具。选择正确的分区策略并配合适当的索引,可以使数据库在数亿行数据下仍然保持高性能。