一、分区表基础:什么是分区表、分区表的类型、分区表的核心优势
大家好,我是老张。今天咱们聊聊分区表。
说实话,我刚开始做DBA那会儿,对分区表也是又爱又怕。爱的是它确实能解决大表性能问题,怕的是用不好反而给自己挖坑。后来踩过几次坑,慢慢就摸出门道了。
嗯,咱们先从最基础的说起。
1.1 什么是分区表?
分区表,说白了就是把一张大表,拆成多个小表来管理。但对外看起来,还是一张表。
你想想看,一张表里存了10亿行数据,查询的时候全表扫描,那得多慢?但如果按月份拆成12个区,查询某个月的数据,就只扫一个区,速度快得多。
我在项目中遇到过这样一个场景:一个订单表,每天新增几百万条记录。半年下来,表体积超过500GB。业务方抱怨查询越来越慢,备份恢复也成了噩梦。后来我们做了分区,按月份分了6个区,查询性能提升了5倍以上。
核心概念:分区表 = 逻辑上一张表 + 物理上多个独立存储单元
每个分区可以独立管理,比如单独备份、单独重建索引。
1.2 分区表的三种主要类型
分区表不是只有一种玩法。根据业务场景不同,我一般会选这三种之一。
1.2.1 范围分区(RANGE)
这是最常用的一种。按某个字段的值范围来划分。
比如按时间分区:
CREATE TABLE orders (
order_id INT,
order_date DATE,
amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
我个人习惯用时间做范围分区,因为数据天然有冷热之分。最近的数据访问频繁,历史数据很少查。这样可以把热数据放在高性能存储上,冷数据放到廉价存储。
小技巧:范围分区时,记得留一个MAXVALUE分区,防止新数据插入失败。我曾经因为忘了加这个,导致线上业务中断了半小时……
1.2.2 列表分区(LIST)
列表分区是按离散值来划分的。比如按地区、按状态。
CREATE TABLE user_info (
user_id INT,
region VARCHAR(20),
name VARCHAR(50)
)
PARTITION BY LIST (region) (
PARTITION p_north VALUES IN ('北京','天津','河北'),
PARTITION p_south VALUES IN ('广东','深圳','海南'),
PARTITION p_east VALUES IN ('上海','江苏','浙江'),
PARTITION p_other VALUES IN ('其他')
);
列表分区适合那种枚举值有限的场景。比如状态字段(待支付、已支付、已取消),每个状态的数据量差异很大,可以单独分区管理。
注意:列表分区不支持多列组合。如果业务需要按多个维度分区,可以考虑用子分区或者复合分区。
1.2.3 哈希分区(HASH)
哈希分区是按哈希值均匀分布数据。适合没有明显分区键的场景。
CREATE TABLE logs (
log_id INT,
log_time DATETIME,
content TEXT
)
PARTITION BY HASH (log_id)
PARTITIONS 8;
哈希分区的优点是数据分布均匀。但缺点也很明显——你不知道某条数据在哪个分区,查询时必须带上分区键。
我记得有一次,开发同事问我:「为什么我按时间查日志,哈希分区没效果?」我一看,他分区键用的是log_id,但查询条件却是log_time。这当然走不了分区裁剪了。
| 分区类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 范围分区 | 时间、数值范围 | 管理方便,支持分区裁剪 | 数据可能倾斜 |
| 列表分区 | 枚举值、地区 | 语义清晰,易于理解 | 值列表需固定 |
| 哈希分区 | 无明确分区键 | 数据分布均匀 | 查询必须带分区键 |
1.3 分区表的核心优势
说了这么多,分区表到底好在哪?我总结了几点:
- 查询性能提升:分区裁剪只扫描相关分区,减少IO。我做过测试,10亿行数据,全表扫描要30秒,分区后只要2秒。
- 管理更方便:可以单独操作某个分区。比如删除历史数据,直接DROP分区,比DELETE快得多。
- 维护窗口缩短:重建索引、收集统计信息,都可以按分区进行,不用锁全表。
- 数据生命周期管理:冷热数据分离,热数据放SSD,冷数据放HDD,省钱又高效。
一句话总结:分区表不是银弹,但用对了地方,效果立竿见影。
1.4 分区表的知识体系
下面这张图,是我自己整理的分区表知识框架。你看一眼,心里就有数了。
这张图把分区表的类型和优势串起来了。你记住一个原则:分区键选对了,事半功倍;选错了,事倍功半。
我的建议:刚开始用分区表,先从范围分区入手。等熟悉了,再尝试列表分区和哈希分区。别一上来就搞复合分区,容易把自己绕晕。
好了,分区表的基础就聊到这儿。下一节咱们聊聊分区表的设计原则和常见坑点。