# 查看某个分区的数据
mysql> SELECT * FROM t1 PARTITION (p2);
# 增加分区
mysql> alter table tr add partition(PARTITION p6 VALUES LESS THAN (2020) );
# 拆分分区
mysql> alter table tr reorganize partition p5 into(
partition s0 values less than(2012),
partition s1 values less than(2015)
);
# 合并分区
mysql> alter table tr reorganize partition s0,s1 into (
partition p5 values less than (2015)
);
# 清空某分区的数据
mysql> alter table tr truncate partition p0;
# 删除分区
mysql> alter table tr drop partition p1;
# 交换分区
# 先创建与分区表同样结构的交换表t2(表结构相同,但没有分区)
# 执行exchange交换分区
mysql> alter table t1 exchange PARTITION p2 with table t2;
分区注意事项及适用场景
其实分区表的使用有很多限制和需要注意的事项,参考官方文档,简要总结几点如下:
分区字段必须是整数类型或解析为整数的表达式。
分区字段建议设置为NOT NULL,若某行数据分区字段为null,在RANGE分区中,该行数据会划分到最小的分区里。
MySQL分区中如果存在主键或唯一键,则分区列必须包含在其中。
Innodb分区表不支持外键。
更改sql_mode模式可能影响分区表的表现。
分区表不影响自增列。
从上面的介绍中可以看出,分区表适用于一些日志记录表。这类表的特点是数据量大、并且有冷热数据区分,可以按照时间维度来进行数据归档。这类表是比较适合使用分区表的,因为分区表可以对单独的分区进行维护,对于数据归档更方便。
4.分区表为什么不常用
在我们项目开发中,分区表其实是很少用的,下面简单说明下几点原因:
分区字段的选择有限制。
若查询不走分区键,则可能会扫描所有分区,效率不会提升。
若数据分布不均,分区大小差别较大,可能性能提升也有限。
普通表改造成分区表比较繁琐。
需要持续对分区进行维护,比如到了6月份前就要新增6月份的分区。
增加学习成本,存在未知风险。
总结:
本文较为详细的介绍了MySQL分区相关内容,如果想使用分区表的话,建议提早做好规划,在初始化的时候即创建分区表并制定维护计划,使用得当还是比较方便的,特别是有历史数据归档需求的表,使用分区表会使归档更方便。当然,关于分区表的内容还有很多,有兴趣的同学可以找找官方文档,官方文档中有大量示例。
浙公网安备 33010602011771号