MYSQL分区表

分区表总共分为以下几种类型

  • 1.range分区
  • 2.list分区
  • 3.hash分区
  • 4.key分区
  • 5.子分区
  • 6.columns分区

分区表适用场景及概要

        当一个表中的数据量太大时,会面临两个问题,一是对数据的操作会变慢,比如select、join、update、delete时,会对全表操作;二是不便于存储,可能会出现剩余磁盘空间存储不下这张表的情况。而分区就可以在一定程度上解决这两个问题。

        简要的说,分区就是将表物理截断,但在逻辑上依然是一个整体,开发人员在数据操作时仍然是对这个整体大表进行操作,之后由数据库底层自己去寻找对应的分区进行操作,数据库底层寻找分区这个过程对开发人员来说是透明的,这样在数据操作时可以只对特定分区操作以提高效率,存储时也可以将不同分区的物理文件分开存放

tips:当过滤条件为分区的字段时才会自动寻找分区,否则还是全表扫描!!!

 1.range分区

range分区,顾名思义,就是按照范围进行分区

* 创建表
create table `range_table`(
    `id` int,
    `name` varchar(10)
) 
* 实现分区
partition by range(id)(
    partition p1 values less than (10),
    partition p2 values less than (20),
    partition p3 values less than maxvalue
);

* 插入数据
insert into range_table (id, name) values (1,"梁静茹"),(10,"金泰妍"),(15,"王菲"),(50,"邵夷贝");

* 查询分区数据量
select partition_name,table_rows from information_schema.partitions where table_name = 'range_table';


* 查询分区数据
select * from range_table partition (p1);
select * from range_table partition (p2);
select * from range_table partition (p3);

* 适用分区条件加速查询
explain select * from range_table where id = "1" and name = '梁静茹';

* 未适用分区,依然是全表扫描
explain select * from range_table where name = '梁静茹';

注意事项:
1.range分区字段只支持整型,如果需要对时间日期这样的字段进行range分区,可以通过相关函数将类型转为整型再分区。

2.list分区

list就是枚举的意思,list分区就是在创建各分区时具体指定哪些值属于这些分区

create table `list_table`(
    `id` int,
    `name` varchar(10)
) 
partition by list(id)(
    partition p1 values in (1),
    partition p2 values in (10,15,50)
);

注意事项
1.id为1的保存到了p1分区,id为10,15,20的保存到了p2分区,需要注意如果插入数据的 id 在各个分区所对应着的列表里面都没找到,则会报错。
2.list分区分区字段同样只能是int型。

 3.hash分区

hash分区分为常规hash和线性hash,常规hash是在分区字段上基于分区个数的取模运算,根据余数分区。线性hash是对分区字段进行二次方运算,根据运算结果分区,所以hash分区同样要求分区字段为整型或者是可以返回整型结果的表达式。二者在建表时候的区别只是线性hash比常规hash多了个linear(线性的)限定。

create table `hash_table`(
    `id` int,
    `name` varchar(10)
) 
partition by hash(id)
partitions 3;

hash分区不能指定分区名,会默认创建名为pn的分区,n从0开始自增。上面这段代码会创建p0,p1,p2三个分区,分区名可以通过下面的sql查看,

select partition_name from information_schema.PARTITIONS where table_schema = schema() and table_name = "hash_table";

4.key分区

create table `key_table`(
    `id` int,
    `name` varchar(10) not null,
    unique `uk_name` (name)
) 
partition by linear key()
partitions 3;

5..子分区(复合分区)

create table `subpart_table`(
    dt date
) 
partition by range(year(dt))
subpartition by hash(month(dt))
subpartitions 2 (
    partition p1 values less than (1990),
    partition p2 values less than (2000),
    partition p3 values less than maxvalue
);

6.column分区

https://www.cnblogs.com/chenmh/p/5630834.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值