分区应该注意的事项:
- 做分区时,要么不定义主键,要么把分区字段加入到主键中
- 分区字段不能为NULL,要不然怎么确定分区范围呢,所以尽量NOT NULL
mysql提供了添加、删除、重定义、合并、拆分分区的命令,这些操作都可以通过alter table 命令来实现
=========================================================
1.range分区操作:
详细地址:https://blog.csdn.net/yinjinshui/article/details/102458253
1.1创建:
create table <table> (
// 字段
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
partition by range (分区字段) (
partition <分区名称> values less than (Value),
partition <分区名称> values less than (Value),
...
partition <分区名称> values less than maxvalue
);
range:表示按范围分区
分区字段:表示要按照哪个字段进行分区,可以是一个字段名,也可以是对某个字段进行表达式运算如year(create_time),使用range最终的值必须是数字
分区名称: 要保证不同,也可以采用 p0、p1、p2 这样的分区名称,
less than : 表示小于
Value : 表示要小于某个具体的值,如 less than (10) 那么分区字段的值小于10的都会被分到这个分区
maxvalue: 表示一个最大的值
1.2新增分区:
alter table <table> add partition(partition <分区名称> values less than <Value>);
1.3删除某个分区:
alter table <table> drop partition <分区名称>;
1.4重置分区,合并分区:
alter table <table>
REORGANIZE PARTITION <Value1>,<Value2>,<Value3>,<Value4> INTO
(
partition <分区名称> values less than (Value2), #将分区1和分区2合并
partition <分区名称> values less than (Value3),
partition <分区名称> values less than (Value4),
);
1.5移除分区:
alter table <table> remove partitioning;
=========================================================
2.list分区操作
详细地址:https://blog.csdn.net/yinjinshui/article/details/102460788
2.1创建分区:
create table <table> (
// 字段
) ENGINE=数据库引擎 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
partition by LIST (分区字段或者基于该字段的返回的整数值的表达式) (
partition <分区名称> values IN (Value1,Value2,Value3),
...
partition <分区名称> values IN (Value4, Value5)
);
list:表示固定值进行分区
分区名称: 要保证不同,也可以采用 p0、p1、p2 这样的分区名称,
ValueN : 表示某个具体的值
2.2新增分区
alter table <table> add partition ( partition <分区名称> values IN (Value1,Value2, Value3));
2.3重置分区,合并分区:
alter table <table>
REORGANIZE PARTITION <Value1>,<Value2>,<Value3>,<Value4>,< Value5> INTO
(
partition <分区名称> values IN (Value1,Value2,Value5),
partition <分区名称> values IN (Value4,Value3)
)
2.4删除分区
alter table <table> drop partition <分区名称>;
2.5移除分区
alter table <table> remove partitioning;
=========================================================
3.hash分区
详细地址:https://blog.csdn.net/yinjinshui/article/details/102465461
3.1创建分区
create table <table> (
// 字段
) ENGINE=数据库引擎 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
PARTITION BY HASH(expr)
PARTITIONS <num>;
hash:表示按hash分区
expr:可以是一个字段名或者基于某列值云散返回的一个整数,
expr可以是mysql中有效的任何函数或者其它表达式【表达式运算如year(create_time)】,只要它们返回一个即非常熟也非随机数的整数。
num:表示分区数量
3.2添加分区
**不支持**
3.3重置分区
alter table <table> add partition partitions <num>;
3.4删除分区
**不支持**
3.5移除表的分区
alter table <table> remove partitioning;
=========================================================
4.key分区
详细地址:https://blog.csdn.net/yinjinshui/article/details/102467242
4.1创建分区
create table <table> (
// 字段
) ENGINE=数据库引擎 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
#方法1:
partition by key(expr) partitions num;
#方法2(不指定默认首选主键作为分区键,在没有主键的情况下会选择非空唯一键作为分区键):
partition by key() partitions num;
#方法3(支持线性分区linear key):
partition by linear key(expr)
expr:是零个或者多个字段名的列表
num:表示分区数量
key分区也支持线性分区linear key
4.2添加分区
**不支持**
4.3重置分区
alter table <table> add partition partitions <num>;
4.4删除分区
**不支持**
4.5移除表的分区
alter table <table> remove partitioning;
=========================================================
5.columns分区
详细地址:https://blog.csdn.net/yinjinshui/article/details/102477372
5.1创建分区
create table <table> (
// 字段
) ENGINE=数据库引擎 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
#方法1:
partition by range columns(expr) (
partition <分区名称> values less than (Value1,Value2),
...
partition <分区名称> values less than (Value3, Value4),
)
#方法2:
partition by list columns(expr) (
partition <分区名称> values in (Value1,Value2),
...
partition <分区名称> values in than (Value3, Value4),
)
expr:支持一个或者多个字段作为分区键
分区名称: 要保证不同,也可以采用 p0、p1、p2 这样的分区名称,
ValueN : 表示某个具体的值
5.2新增分区
alter table <table> add partition (partition <分区名称> values less than ( (Value1,Value2));
alter table <table> add partition ( partition <分区名称> values IN (Value1,Value2, Value3));
5.3重置分区
alter table <table>
REORGANIZE PARTITION <Value1>,<Value2>,<Value3>,<Value4> INTO
(
partition <分区名称> values less than (Value2), #将分区1和分区2合并
partition <分区名称> values less than (Value3),
partition <分区名称> values less than (Value4),
);
alter table <table>
REORGANIZE PARTITION <Value1>,<Value2>,<Value3>,<Value4>,< Value5> INTO
(
partition <分区名称> values IN (Value1,Value2,Value5),
partition <分区名称> values IN (Value4,Value3)
)
5.4删除分区
alter table <table> drop partition <分区名称>;
5.5移除分区
alter table <table> remove partitioning;
=========================================================
6.子分区
6.1创建分区
#语法1:
create table <table> (
// 字段
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
partition by range (分区字段)
SUBPARTITION BY HASH(分区字段)
SUBPARTITIONS NUM(
partition <分区名称> values less than (Value),
partition <分区名称> values less than (Value),
...
partition <分区名称> values less than maxvalue
)
分区字段:表示要按照哪个字段进行分区,可以是一个字段名,也可以是对某个字段进行表达式运算如year(create_time),使用range最终的值必须是数字
分区名称: 要保证不同,也可以采用 p0、p1、p2 这样的分区名称,
less than : 表示小于
Value : 表示要小于某个具体的值,如 less than (10) 那么分区字段的值小于10的都会被分到这个分区
maxvalue: 表示一个最大的值
NUM:子分区数
#语法2:
create table <table> (
// 字段
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
partition by range (分区字段)
SUBPARTITION BY HASH(分区字段)
SUBPARTITIONS NUM(
partition <分区名称> values less than (Value)(
subpartition <子分区名称>,
subpartition <子分区名称>
),
partition <分区名称> values less than (Value)(
subpartition <子分区名称>,
subpartition <子分区名称>
),
...
partition <分区名称> values less than maxvalue(
subpartition <子分区名称>,
subpartition <子分区名称>
)
)
分区字段:表示要按照哪个字段进行分区,可以是一个字段名,也可以是对某个字段进行表达式运算如year(create_time),使用range最终的值必须是数字
分区名称: 要保证不同,也可以采用 p0、p1、p2 这样的分区名称,
子分区名称: 要保证不同,也可以采用 s0、s1、s2 这样的子分区名称,子分区的名称不能喝分区名称重复
less than : 表示小于
Value : 表示要小于某个具体的值,如 less than (10) 那么分区字段的值小于10的都会被分到这个分区
maxvalue: 表示一个最大的值
6.2添加子分区
**不支持**
6.3子分区重命名(只能对每个分区进行操作,不能针对每个子分区进行删除或添加操作)
alter table
REORGANIZE partition <分区名称>,<分区名称>,<分区名称>,<分区名称> into(
partition f1 values less than (2019)(
subpartition <子分区名称>,
subpartition <子分区名称>
),
partition f2 values less than (2020)(
subpartition <子分区名称>,
subpartition <子分区名称>
),
partition f3 values less than MAXVALUE(
subpartition <子分区名称>,
subpartition <子分区名称>
)
)
6.4删除子分区(只能对每个分区进行操作,不能针对每个子分区进行删除或添加操作)
**不支持**
6.5移除子分区(只能对每个分区进行操作,不能针对每个子分区进行删除或添加操作)
**不支持**