MySQL 分区表创建方法

Oracle 创建分区表 https://www.cnblogs.com/vipsoft/p/8960844.html

MySQL 分区表创建方法

MySQL 也支持分区表,但与 Oracle 的语法有所不同。以下是 MySQL 中创建分区表的几种方式:

1. 创建范围分区表(类似 Oracle 的 RANGE 分区)

CREATE TABLE table_test (
    id VARCHAR(36) NOT NULL PRIMARY KEY,
    event_id VARCHAR(36),
    patient_id VARCHAR(36),
    patient_name VARCHAR(50),
    ward_id VARCHAR(36),
    ward_name VARCHAR(50),
    issue_time DATETIME
)
PARTITION BY RANGE (YEAR(issue_time) * 100 + MONTH(issue_time)) (
    PARTITION p1 VALUES LESS THAN (201801),  -- 2018年1月之前
    PARTITION p2 VALUES LESS THAN (201804),  -- 2018年4月之前
    PARTITION p3 VALUES LESS THAN (201807),
    PARTITION p4 VALUES LESS THAN (201810),
    PARTITION p5 VALUES LESS THAN MAXVALUE
);

2. 创建自动扩展的范围分区(MySQL 8.0+)

MySQL 没有直接的 INTERVAL 分区,但可以通过以下方式模拟:

CREATE TABLE table_test (
    id VARCHAR(36) NOT NULL PRIMARY KEY,
    event_id VARCHAR(36),
    patient_id VARCHAR(36),
    patient_name VARCHAR(50),
    ward_id VARCHAR(36),
    ward_name VARCHAR(50),
    issue_time DATETIME
)
PARTITION BY RANGE (TO_DAYS(issue_time)) (
    PARTITION p_historic VALUES LESS THAN (TO_DAYS('2018-01-01')),
    PARTITION p_current VALUES LESS THAN (MAXVALUE)
);

3. 将现有表转换为分区表

MySQL 不能直接修改表为分区表,需要创建新表并迁移数据:

-- 创建新分区表
CREATE TABLE e_charge_record_new (
    -- 列定义与原表相同
    -- ...
    issue_time DATETIME
)
PARTITION BY RANGE (YEAR(issue_time)) (
    PARTITION p_2014 VALUES LESS THAN (2015),
    PARTITION p_2015 VALUES LESS THAN (2016),
    PARTITION p_2016 VALUES LESS THAN (2017),
    PARTITION p_2017 VALUES LESS THAN (2018),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

-- 迁移数据
INSERT INTO e_charge_record_new SELECT * FROM e_charge_record;

-- 重命名表
RENAME TABLE e_charge_record TO e_charge_record_old, 
             e_charge_record_new TO e_charge_record;

4. MySQL 分区类型

MySQL 支持多种分区类型:

  • RANGE: 基于列值范围分区
  • LIST: 基于列值列表分区
  • HASH: 基于哈希函数分区
  • KEY: 类似于 HASH,但使用 MySQL 内部哈希函数
  • 复合分区: 如 RANGE + HASH

注意事项

  1. MySQL 分区表的主键必须包含分区键
  2. 分区表不支持外键约束
  3. 分区数量有限制(通常为1024个)
  4. 不同存储引擎对分区的支持不同(InnoDB 完全支持)

MySQL 的分区功能相比 Oracle 较为简单,特别是缺少自动间隔分区功能,需要手动管理分区或通过定期脚本维护。

posted @ 2025-06-11 12:13  VipSoft  阅读(169)  评论(0)    收藏  举报