CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE(YEAR(purchased))
SUBPARTITION BY HASH(TO_DAYS(purchased))
(
PARTITION p0 VALUES LESS THAN (1990)
(
SUBPARTITION s0a
DATA DIRECTORY = '/disk0'
INDEX DIRECTORY = '/disk1',
SUBPARTITION s0b
DATA DIRECTORY = '/disk2'
INDEX DIRECTORY = '/disk3'
),
PARTITION p1 VALUES LESS THAN (2000)
(
SUBPARTITION s1a
DATA DIRECTORY = '/disk4/data'
INDEX DIRECTORY = '/disk4/idx',
SUBPARTITION s1b
DATA DIRECTORY = '/disk5/data'
INDEX DIRECTORY = '/disk5/idx'
),
PARTITION p2 VALUES LESS THAN MAXVALUE
(
SUBPARTITION s2a,
SUBPARTITION s2b
)
);
MySQL提供了许多修改分区表的方式。添加、删除、重新定义、合并或拆分已经存在的分区是可能的。
所有这些操作都可以通过使用ALTER TABLE
命令的分区扩展来实现。
为已创建的未分区表创建分区:
ALTER TABLE tb PARTITION BY RANGE (expr) ( range_partitions_exprs(n>0) );
ALTER TABLE tb PARTITION BY LIST (expr) ( list_partitions_exprs(n>0) );
ALTER TABLE tb PARTITION BY HASH(expr) PARTITIONS 2;
ALTER TABLE tb PARTITION BY KEY(expr) PARTITIONS 2;
为分区表添加n个分区:
ALTER TABLE tb ADD PARTITION ( range_partitions_exprs(n>0) );
ALTER TABLE tb ADD PARTITION ( list_partitions_exprs(n>0) );
ALTER TABLE tb ADD PARTITION PARTITIONS n;
reorganize
数据不丢失的前提下,将m个分区合并为n个分区(m>n),即减量重新组织分区
ALTER TABLE tb REORGANIZE PARTITION s0,s1,... INTO ( range_partitions_exprs(n) )
ALTER TABLE tb REORGANIZE PARTITION s0,s1,... INTO ( list_partitions_exprs(n) )
ALTER TABLE clients COALESCE PARTITION n; (n小于原有分区数)
数据不丢失的前提下,将分区表的m个分区拆分为n个分区(m<n),即增量重新组织分区
ALTER TABLE tb REORGANIZE PARTITION p0,p1,... INTO ( range_partitions_exprs(n) )
ALTER TABLE tb REORGANIZE PARTITION p0,p1,... INTO ( list_partitions_exprs(n) )
不能使用REORGANIZE PARTITION来改变表的分区类型;也就是说。
重建分区,即先删除分区中的所有记录,然后重新插入。可用于整理分区碎片。
ALTER TABLE tb REBUILD PARTITION p0, p1;
优化分区,整理分区碎片 optimize
ALTER TABLE tb OPTIMIZE PARTITION p0, p1;
如从分区中删除了大量的行,或者对一个带有可变长度字段(VARCHAR、BLOB、TEXT类型)的行作了许多修改,可以使用优化分区来收回没有使用的空间,并整理分区数据文件的碎片。
修复分区,修补被破坏的分区。
ALTER TABLE tb REPAIR PARTITION p0,p1;
检查分区,这个命令可以告诉你分区中的数据或索引是否已经被破坏,如果被破坏,请使用修复分区来修补
ALTER TABLE tb CHECK PARTITION p1;
删除一个分区,以及分区内的所有数据:
ALTER TABLE tb DROP PARTITION p2;
删除一个分区,但保留分区内的所有数据(MySQL 5.5引入): truncate
ALTER TABLE tb TRUNCATE PARTITION p2;
查看某个schema下某个表的分区信息
SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'xxx' AND TABLE_NAME LIKE 'xxxx';
分析某个分区,主要看行数和名称以及状态
ALTER TABLE tb ANALYZE PARTITION p3;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有