postgre分区方式

7 阅读2分钟

主要有 3 种:RANGE、LIST、HASH。

分区方式中文按什么分典型场景
RANGE范围分区数值/日期范围时间、订单、日志
LIST列表分区指定的离散值国家、地区、业务类型
HASH哈希分区哈希计算结果数据均匀拆分

1. RANGE 范围分区

按照一个连续的范围来分。

比如按照订单日期:

orders
│
├── 1月分区:2026-01-01 ~ 2026-02-01
├── 2月分区:2026-02-01 ~ 2026-03-01
└── 3月分区:2026-03-01 ~ 2026-04-01

创建方式:

CREATE TABLE orders (
    id bigint,
    order_date date
) PARTITION BY RANGE (order_date);

例如:

CREATE TABLE orders_2026_01
PARTITION OF orders
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');

也就是:

RANGE = 按区间分。

你资料中的 measurement 就是按照 logdate 做 RANGE 分区。

它特别适合时间数据,比如日志、订单、流水。


2. LIST 列表分区

按照明确指定的几个值来分。

例如有:

用户表 users

country = 'CN'
country = 'JP'
country = 'US'

可以:

users
│
├── users_asia_1 → CN
├── users_asia_2 → JP
└── users_us     → US

本质就是:

这个值属于哪个列表
        ↓
数据就进入哪个分区

所以:

LIST = 按具体值分类。

例如国家、地区、部门、业务类型等离散值比较适合。资料的定义也是通过显式列出每个分区中允许出现的键值来划分。


3. HASH 哈希分区

HASH 不需要人为规定:

1月 → A
2月 → B

而是数据库通过计算,把数据分散到几个分区。

例如:

user_id
   ↓
HASH计算
   ↓
除以4取余数
   ↓
┌────┬────┬────┬────┐
0    1    2    3
↓    ↓    ↓    ↓
P0   P1   P2   P3

比如:

user_id = 1001 → P1
user_id = 1002 → P2
user_id = 1003 → P3
user_id = 1004 → P0

它的重点是:

HASH = 不关心业务范围,主要希望把数据比较均匀地分散到多个分区。

资料中描述为给每个分区指定模数和余数,根据计算结果决定数据属于哪个分区。


三种方式怎么记?

直接记这三个例子:

RANGE(范围)
按照时间:
1月 | 2月 | 3月 | 4月

LIST(列表)
按照类别:
中国 | 日本 | 美国

HASH(哈希)
按照计算:
P0 | P1 | P2 | P3

所以选择的时候可以简单判断:

有明显的连续范围 → RANGE;有明确的类别 → LIST;没有明显分类、只是希望数据均匀拆开 → HASH。

另外,资料还提到了子分区:一个分区本身还可以继续成为分区表,例如先按月份 RANGE 分,再在每个月内部继续分。