mysql表分区

1,表分区简介

1.1 什么是表分区

就是将一个表按照条件分割成若干个小表(并不是物理表,而是一个分区,每个分区对应一个文件),将表从一个大的数据文件分成了若干个小的数据文件;mysql5.1后支持分区

1.2 为什么要分区

这就很简单了,提高查询速度的目的较多。还有方便管理,提高最大存储量,提高吞吐量等

2,分区类型

2.1 基本分区类型

  • Range分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段. 基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。其实就是根据表的一个字段来进行分区,比如说根据年龄段来进行分区。
create table t1 (id int,age int,name varcher(20),pos_date datetime)
pratition by range(age)
(
pratition p01 values less than (10),
pratition p01 values less than (20),
pratition p01 values less than (30),
pratition p01 values less than (maxvalues)
);
  • List分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。其实真的是和range类似,range是根据范围来分,list可以更具体一些,比如说根据生肖来分区(年龄是离散的)。
create table t1 (id int,cidint,name varcher(20),pos_date datetime)
pratition by list(cid)
(
pratition p01 values less than (1,4,7),
pratition p01 values less than (2,5,8),
pratition p01 values less than (3,6,9),
);
  • Hash分区:基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH,对于非整形的字段只能通过表达式将其转换成整数。
create table t3 (id int,age int,name varcher(20),pos_date datetime)
pratition by hash(cid)
pratitions 4;

线性哈希:使用一个线性2的幂;有利于存储大量数据,增删合拆更快,但是分布不均匀。

语法:同上hash前面加linear

  • KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。
create table t3 (id int,age int,name varcher(20),pos_date datetime)
pratition by key(cid)
pratitions 4;
  • 多列分区:  就是允许通过多个列来定义一个分区
create table t1 (a int,b int,c int)
pratition by range columns(a ,b)
(
pratition p01 values less than (10,10),
pratition p01 values less than (10,20),
pratition p01 values less than (10,30),
pratition p01 values less than (10,maxvalues)
pratition p01 values less than (maxvalues,maxvalues)
);

2.2 子分区

通俗说就是子分区就是在表分区后再进行分区

create table t4 (id int, udate date)
partition by range(year (udate))
subpartition by hash (to_days(udate))
subpartitions 2
(
partition p01 values less than(1990),
partition p01 values less than(20000),
partition p01 values less than(maxvalues)
);

注意:每个分区的子分区数量必须一致

2.3 分区管理

修改分区
alter table t1 partition by range(age)
(
partition p01 values less than(10),
partition p01 values less than(20),
)

删除分区(包括数据)
alter table t1 drop partition  p02;
删除分区的数据
alter table t1 truncate partition p01;

新增分区(只能从高端上加)
alter table access_log add partition(
    partition p4 values less than (to_days('20190105'))
);

拆分分区
alter table access_log reorganize partition p4 into(
    -> partition s0 values less than(to_days('20190104')),
    -> partition s1 values less than(to_days('20190105'))
    -> );

合并分区
alter table access_log reorganize partition s0,s1 into ( 
    partition p4 values less than (to_days('20190105')) 
);

当分区建立后,分区需持续关心。后续可能出现各种状况,可以进行相应的重建、优化、修复等操作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值