一、分区表基础:什么是分区表、分区表的类型、分区表的核心优势

大家好,我是老张。今天咱们聊聊分区表。

说实话,我刚开始做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 分区表的知识体系

下面这张图,是我自己整理的分区表知识框架。你看一眼,心里就有数了。

分区表 范围分区 列表分区 哈希分区 查询性能提升 管理更方便 维护窗口缩短 数据生命周期管理 注意:分区键选择不当,性能反而下降 查询必须带分区键才能走分区裁剪

这张图把分区表的类型和优势串起来了。你记住一个原则:分区键选对了,事半功倍;选错了,事倍功半。

我的建议:刚开始用分区表,先从范围分区入手。等熟悉了,再尝试列表分区和哈希分区。别一上来就搞复合分区,容易把自己绕晕。

好了,分区表的基础就聊到这儿。下一节咱们聊聊分区表的设计原则和常见坑点。

可可精品资料库