1.背景
当前数据库中,数据库表已经存在,同时该数据库表的数据还在每天不断增长。因为数据库表太大,导致检索过程耗时,为提高检索效率,故对相关数据库表进行分区处理。
2.MySQL分区
分区就是将一个表分解成多个区块进行操作和保存,从而降低每次操作的数据,提高性能。
而对应用来说是透明的,从逻辑上看是只有一个表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是一个独立的对象,可以进行独立处理
四种常见的分区类型:
RANGE分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段。LIST分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
3.示例
3.1 RANGE分区
情景:现有hourdb数据库表,想要基于该数据库表的time字段进行分区。
实现:
1 | -- 1.对hourdb表进行分区 |
注意:在分区时,一定要按照从小到大的顺序,已经分区的内容将不再参与后续的分区。
3.2 LIST分区
1 | CREATE TABLE `staff_partition_list` ( |
3.3 HASH分区
1 | CREATE TABLE `staff_partition_hash` ( |
每次插入、更新、删除一行,hash表达式都要计算一次;这意味着非常复杂的表达式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候。
3.4 KEY分区
1 | CREATE TABLE `staff_partition_key` ( |

4.分区管理
4.1删除分区
1 | alter table staff_partition drop partition p0; |
上述语句删除p0分区,同时也会删除p0分区的数据。
1 | alter table staff_partition remove partitioning; |
上述语句只删除p0分区,但是保留了p0分区的数据。
1 | -- 对于hash分区和key分区 |
上述命令将当前的分区数量减少到 2 个分区,数据库系统会自动选择哪些分区合并,重新分配数据
4.2增加分区
RANGE和LIST分区
1 | alter table staff_partition add partition(partition p3 values LESS THAN (20)); |
- 对于RANGE分区的表,只可以添加新的分区到分区列表的高端
- 对于List分区的表,不能添加已经包含在现有分区值列表中的任意值
HASH和KEY分区
1 | alter table test_staff_partition_hash add PARTITION partitions 2; |
4.3重新分区
1 | ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO |
4.4优化分区
如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB,或TEXT类型的列)作了许多修改,可以使用ALTER TABLE ... OPTIMIZE PARTITION来收回没有使用的空间,并整理分区数据文件的碎片。
1 | alter table test_staff_partition OPTIMIZE PARTITION p2,p3; |