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
注意事项
- MySQL 分区表的主键必须包含分区键
- 分区表不支持外键约束
- 分区数量有限制(通常为1024个)
- 不同存储引擎对分区的支持不同(InnoDB 完全支持)
MySQL 的分区功能相比 Oracle 较为简单,特别是缺少自动间隔分区功能,需要手动管理分区或通过定期脚本维护。
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18923594
浙公网安备 33010602011771号