当前位置 主页 > 技术大全 >

    mysql 创建分区,常见的分区创建方法

    栏目:技术大全 时间:2025-09-22 15:11


    在 MySQL 中,分区表是将大表数据按一定规则拆分到多个物理子表中,可提升查询效率(尤其是大数据量场景)。MySQL 支持多种分区类型,以下是常见的分区创建方法:

    一、分区前提

    • 分区表的所有分区必须使用相同的存储引擎。
    • 主键或唯一索引必须包含分区字段(否则无法创建分区)。

    二、常见分区类型及创建示例

    1. 范围分区(RANGE Partitioning)

    按字段的范围值分区(如按时间、数值范围),适合日志、订单等有时间序列的数据。
    示例:按订单日期分区
    sql
    -- 创建按月份分区的订单表
    CREATE TABLE orders (
      id INT PRIMARY KEY AUTO_INCREMENT,
      order_no VARCHAR(20) NOT NULL,
      amount DECIMAL(10,2),
      create_time DATE NOT NULL  -- 分区字段
    )
    PARTITION BY RANGE (TO_DAYS(create_time)) (
      PARTITION p202301 VALUES LESS THAN (TO_DAYS('2023-02-01')),
      PARTITION p202302 VALUES LESS THAN (TO_DAYS('2023-03-01')),
      PARTITION p202303 VALUES LESS THAN (TO_DAYS('2023-04-01')),
      PARTITION p_other VALUES LESS THAN MAXVALUE  -- 匹配所有超出范围的数据
    );
    
     
    • 按 create_time 字段的天数(TO_DAYS() 转换)分区,每个分区存储一个月的数据。
    • p_other 用于存储未匹配到前面分区的数据,避免插入数据失败。

    2. 列表分区(LIST Partitioning)

    按字段的离散值分区(如按地区、状态码),适合字段值固定且有限的场景。
    示例:按地区分区
    sql
    -- 创建按地区ID分区的用户表
    CREATE TABLE users (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(50) NOT NULL,
      region_id INT NOT NULL  -- 分区字段(如1:华北,2:华东,3:华南)
    )
    PARTITION BY LIST (region_id) (
      PARTITION p_north VALUES IN (1,4,5),  -- 华北及周边地区
      PARTITION p_east VALUES IN (2,6),     -- 华东地区
      PARTITION p_south VALUES IN (3)       -- 华南地区
    );
    
     
    • 每个分区包含指定的 region_id 列表,插入数据时根据 region_id 分配到对应分区。

    3. 哈希分区(HASH Partitioning)

    按字段的哈希值均匀分配数据,适合数据分布较均匀、无明显范围特征的场景。
    示例:按用户 ID 哈希分区
    sql
    -- 创建按ID哈希分成4个分区的表
    CREATE TABLE logs (
      id INT PRIMARY KEY,
      content TEXT,
      user_id INT NOT NULL  -- 分区字段
    )
    PARTITION BY HASH (user_id)
    PARTITIONS 4;  -- 分成4个分区
    
     
    • MySQL 会自动计算 user_id 的哈希值,将数据平均分配到 4 个分区中。

    4. 键分区(KEY Partitioning)

    类似哈希分区,但由 MySQL 自动计算哈希值(支持字符串等更多类型)。
    示例:按用户名键分区
    sql
    CREATE TABLE user_login (
      id INT PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(50) NOT NULL  -- 分区字段
    )
    PARTITION BY KEY (username)
    PARTITIONS 3;  -- 分成3个分区
    
     

    三、管理分区

    1. 查看分区信息

    sql
    -- 查看表的分区结构
    SELECT PARTITION_NAME, TABLE_ROWS 
    FROM INFORMATION_SCHEMA.PARTITIONS 
    WHERE TABLE_NAME = 'orders';
    
     

    2. 添加新分区(范围分区示例)

    sql
    -- 为orders表添加2023年4月的分区
    ALTER TABLE orders 
    ADD PARTITION (
      PARTITION p202304 VALUES LESS THAN (TO_DAYS('2023-05-01'))
    );
    
     

    3. 删除分区(注意:会同时删除分区内的所有数据)

    sql
    -- 删除p202301分区
    ALTER TABLE orders DROP PARTITION p202301;
    
     

    四、注意事项

    1. 查询优化:查询时尽量包含分区字段(如 WHERE create_time = '2023-01-15'),MySQL 会只扫描对应分区,提升效率。
    2. 分区键选择:优先选择查询频繁、区分度高的字段(如时间、地区)。
    3. 避免过度分区:分区数量过多(如超过 1000 个)可能反而降低性能。
    4. 版本支持:某些分区功能(如子分区)在 MySQL 5.7+ 版本才完善,建议使用 8.0 及以上版本。
    合理使用分区可以显著提升大表的查询和维护效率,尤其适合数据量百万级以上的场景。
1分钟搞定MySQL部署!Docker最强实操指南,含所有常用命令和配置
忘记MySQL密码怎么办?别慌!用这一招跳过验证,轻松重置管理员权限
MySQL自增主键用完怎么办?从原理到实战,全面破解开发中的高频难题
MySQL权限混乱?这几个命令让你彻底理清用户清单与权限归属
你的数据库安全吗?读懂MySQL这几种日志,关键时刻能「救你一命」
MySQL性能上不去?八成是这里没配好!手把手教你搞定my.cnf核心配置
修改MySQL字段长度别乱来!这3个核心要点和1个致命陷阱,新手必看
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
你的MySQL数据库为什么总是又慢又卡?掌握这五大优化法则,查询速度快十倍!(上篇)
你的MySQL数据库为什么总是又慢又卡?掌握这五大优化法则,查询速度快十倍!(下篇)