主要有 3 种:RANGE、LIST、HASH。
| 分区方式 | 中文 | 按什么分 | 典型场景 |
|---|---|---|---|
RANGE |
范围分区 | 数值/日期范围 | 时间、订单、日志 |
LIST |
列表分区 | 指定的离散值 | 国家、地区、业务类型 |
HASH |
哈希分区 | 哈希计算结果 | 数据均匀拆分 |
1. RANGE 范围分区
按照一个连续的范围来分。
比如按照订单日期:
yaml
orders
│
├── 1月分区:2026-01-01 ~ 2026-02-01
├── 2月分区:2026-02-01 ~ 2026-03-01
└── 3月分区:2026-03-01 ~ 2026-04-01
创建方式:
sql
CREATE TABLE orders (
id bigint,
order_date date
) PARTITION BY RANGE (order_date);
例如:
sql
CREATE TABLE orders_2026_01
PARTITION OF orders
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
也就是:
RANGE = 按区间分。
你资料中的 measurement 就是按照 logdate 做 RANGE 分区。
它特别适合时间数据,比如日志、订单、流水。
2. LIST 列表分区
按照明确指定的几个值来分。
例如有:
ini
用户表 users
country = 'CN'
country = 'JP'
country = 'US'
可以:
bash
users
│
├── users_asia_1 → CN
├── users_asia_2 → JP
└── users_us → US
本质就是:
markdown
这个值属于哪个列表
↓
数据就进入哪个分区
所以:
LIST = 按具体值分类。
例如国家、地区、部门、业务类型等离散值比较适合。资料的定义也是通过显式列出每个分区中允许出现的键值来划分。
3. HASH 哈希分区
HASH 不需要人为规定:
css
1月 → A
2月 → B
而是数据库通过计算,把数据分散到几个分区。
例如:
user_id
↓
HASH计算
↓
除以4取余数
↓
┌────┬────┬────┬────┐
0 1 2 3
↓ ↓ ↓ ↓
P0 P1 P2 P3
比如:
ini
user_id = 1001 → P1
user_id = 1002 → P2
user_id = 1003 → P3
user_id = 1004 → P0
它的重点是:
HASH = 不关心业务范围,主要希望把数据比较均匀地分散到多个分区。
资料中描述为给每个分区指定模数和余数,根据计算结果决定数据属于哪个分区。
三种方式怎么记?
直接记这三个例子:
sql
RANGE(范围)
按照时间:
1月 | 2月 | 3月 | 4月
LIST(列表)
按照类别:
中国 | 日本 | 美国
HASH(哈希)
按照计算:
P0 | P1 | P2 | P3
所以选择的时候可以简单判断:
有明显的连续范围 → RANGE;有明确的类别 → LIST;没有明显分类、只是希望数据均匀拆开 → HASH。
另外,资料还提到了子分区 :一个分区本身还可以继续成为分区表,例如先按月份 RANGE 分,再在每个月内部继续分。