MySql表分区的创建与使⽤
⼀、创建表分区
MySql默认是⽀持表分区的,可以通过语句查询是否开启表分区功能:show plugins ;
创建表分区只需要在创建表的语句后⾯加上分区语句就可以,例如:
create table user(id int(11) not null,name varchar(32) not null)  --正常的创建语句
partition by range(id)  --根据表字段id来创建分区
(
partition p0 values less than(10),      --第⼀个分区p0,范围~-9
partition p1 values less than(20),      --第⼆个分区p1,范围10-19
partition p2 values less than(30),      --第三个分区p2,范围20-29
partition p3 values less than maxvalue  --第四个分区p2,范围30-~
)
--需要注意的是分区字段“id”的取值范围等于分区取值范围
数据存储⽂件将根据分区被拆分成多份:*.ibd , .frm⽂件是表格式⽂件:
新增⼏条数据后查询可以看到数据已经分散在不同的分区中:
⼆、表分区的类型
1、RANGE表分区:范围表分区,按照⼀定的范围值来确定每个分区包含的数据,如上使⽤的就是range表分区;
partition by range(id)          partition p0 values less than()
mysql创建表数据类型分区函数使⽤的字段必须是整数类型(bit, int ,tinyint,bigint等),分区的定义范围必须是连续的,且不能重叠,使⽤values less than()来定义分区范围,从⼩到⼤定义范围。
给分区字段赋值的时候分区字段取值范围不能超过values less than()的取值范围。使⽤values less than maxvalue来将未来不确定的值放到这个表分区中。
按时间类型(datetime)来做表分区可以在RANGE()中使⽤函数来做转换,例如:partition by range(year(create_time)),timestamp 可以使⽤unix_timestamp('2019-11-20 00:00:00')转化。
2、LIST表分区:列表表分区,按照⼀个⼀个确定的值来确定每个分区包含的数据
partition by list(id)        partition p0 values in(1,2,3)
分区字段必须是整数类型或者分区函数返回整数,取值范围通过values in()来定义。不能使⽤maxvalue。
create table user4(sex int(1)) partition by list(sex) (partition p0 values in(1),partition p1 values in(2));
3、HASH表分区:哈希表分区,按照⼀个⾃定义的函数返回值来确定每个分区包含的数据
partition by hash(id)        partitions 4
根据hash算法来分配到分区中,以上设置四个分区,并根据id%4进⾏取模运算,根据余数插⼊到指定的分区中。
create table user7(id int)  partition by hash(id) partitions 3;
4、KEY表分区:key表分区,与哈希表分区类似,只是⽤MySql⾃⼰的HASH函数来确定每个分区包含的数据;
partition by key()        partitions 4
key()括号⾥⾯可以包含0个或多个字段(不必是整数类型,可以是普通字段),如果表中有主键或者
唯⼀键,所引⽤的字段必须是主键或者主键的⼀部分。如果没有写字段,默认使⽤主键,如果表中没有主键,则使⽤唯⼀键,但唯⼀键必须设置为not null。
5、多字段分区(range、list):可以指定多个字段作为分区字段;以下以多字段range作为讲解:
例如:partition by range columns(id,name)
多字段分区可以使⽤⾮整数类型来作为分区字段。使⽤这个特性可以⽤来创建单字段的⾮整数类型的表分区。
对⽐⽅式从左到右,第⼀个字段值⼩于第⼀个字段分区值则放在第⼀个分区,等于或⼤于第⼀个字段分区值则对⽐第⼆个字段值与第⼀个字段分区值的⼤⼩,以此类推。
create table user6(sex varchar(10),name varchar(10),age varchar(10)) partition by range columns(sex,name,age) (partition p0 values less than('d','f','h'),partition p1 values less than('l','n','x'));
先⽐较sex字段,再⽐较name字段,最后⽐较age字段。使⽤select ('a','b')<('b','c')来验证
三、创建表分区的约束条件
1、如果表有主键(primary key)或者唯⼀键(unique key),分区字段必须被包含于主键和唯⼀键字段的交集部分。
错误的例⼦:
正确的例⼦:
三、表分区的使⽤
1、使⽤分区字段"id"做查询的时候只查询id所处的分区,否则查询所有分区:
四、表分区的主要优点
1、可以允许在⼀个表⾥存储更多的数据,突破磁盘限制和⽂件系统限制。
2、对于从表⾥删除过期的历史数据⽐较容易,只需要移除对应的分区。
3、对于某些查询或修改语句,可以⾃动将数据范围缩⼩到⼀个⾄⼏个分区上,优化语句执⾏效率。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。