外观
分区管理和维护操作
删除分区
仅限于范围分区和列表分区,会丢失数据
mysql
# 一次性删除一个分区
alter table emp drop partition p1;
# 一次性删除多个分区
alter table emp drop partition p1,p2;1
2
3
4
5
2
3
4
5
增加分区
mysql
# 增加范围分区
alter table emp add partition (partition p3 values less than (5000));
# 增加列表分区
alter table emp add partition (partition p3 values in (5000));1
2
3
4
5
2
3
4
5
分解分区(不会丢失数据)
reorganize partition 关键字可以对表的部分分区或全部分区进行修改,并且不会丢失数据。分解前后分区的整体范围应该一致。
mysql
alter table t
reorganize partition p1 into
(
partition p1 values less than (1000),
partition p3 values less than (2000)
);1
2
3
4
5
6
2
3
4
5
6
合并分区(不会丢失数据)
随着分区数量的增多,有时需要把多个分区合并成一个分区,可以使用 into 指令实现。
mysql
alter table t
reorganize partition p1,p3 into
(partition p1 values less than (10000));1
2
3
2
3
重新定义哈希分区(不会丢失数据)
想要对哈希分区进行扩容或缩容,可以对现有的哈希分区进行重新定义。
mysql
alter table t partition by hash(salary) partitions 8;1
重新定义范围分区(不会丢失数据)
想要对范围分区进行扩容或缩容,可以对现有范围分区进行重新定义。
mysql
alter table t partition by range(salary)
(
partition p1 values less than (20000),
partition p2 values less than (30000)
);1
2
3
4
5
2
3
4
5
删除表的所有分区(不会丢失数据)
如果要删除表的所有分区,但又不想删除数据,可以执行如下语句:
mysql
# 注意是 `partitioning`,不是 `partition`
alter table emp remove partitioning;1
2
2
重建分区
这和先删除保存在分区中的所有记录,然后重新插入它们具有同样的效果,可用于整理分区碎片。
mysql
alter table emp rebuild partition p1,p2;1
优化分区
如果从分区中删除了大量的行,或者对一个带有可变长度的行做了许多修改,那么可以使用 alter table ... optimize partition 来收回没有使用的空间,并整理分区数据文件的碎片。
mysql
alter table t optimize partition p1,p2;1
分析分区
想要对现有的分区进行分析,可以执行如下语句:
mysql
alter table t analyze partition p1,p2;1
语句作用
针对分区表,只分析指定分区 p1、p2,收集分区内数据统计信息,更新 MySQL 优化器需要的索引直方图、行数、数据分布等元数据。
等价于普通表的 ANALYZE TABLE t;,但普通表整表分析,这条语句只针对部分分区,更轻量化。
底层意义:优化器统计信息
MySQL 执行 SQL 时,优化器依靠统计信息判断:走哪个索引、全表扫还是索引扫描、关联顺序。
当分区发生大量数据增删改(批量导入、删除历史分区、REORGANIZE 拆分 / 合并分区)后,统计信息会过时,导致优化器选错索引,出现慢查询。
执行 ANALYZE PARTITION 重新采集最新数据分布。
修补分区
mysql
-- 修补被破坏的分区
alter table t repairpartition p1,p2;1
2
2
检查分区
想要查看现有的分区是否被破坏,可以执行如下语句:
mysql
-- 检查表指定的分区
alter table t check partition p1,p2;1
2
2
这条语句可以告诉我们表 t 的分区 p1、p2 中的数据或索引是否已经被破坏了。如果分区被破坏了,那么可以使用 alter table ... repairpartition 来修补该分区。