MySQL学习笔记(8)—— 分区表

一、什么是分区表

  • 分区表就是按照某种规则同一张表的数据分段划分到多个位置存储

  • 对数据的分区存储提高了数据库的性能被分区存储的数据在物理上是多个文件,但在逻辑上仍然是一个表对表的任何操作都跟没分区之前一样。在执行增、删、改、查等操作时,数据库会自动找到对应的分区,然后执行操作。

  • MySQL从5.1.3开始支持分区(Partition)

  • 在MySQL 8.0中,只有InnoDBNDB两个存储引擎支持分区。

二、分区表的好处

在这里插入图片描述

三、分区表的四种类型

  • MySQL支持的分区类型包括RangeListHashKey,其中Range最常用

1. Range分区

  • Range分区是基于属于一个给定连续区间的列值,把多行分配给分区

  • 示例

    #Range分区示例
    create table user_range(
    	id int not null auto_increment,
     	name varchar(30) ,
     	age int,
     	birthday date,
     	province int,
     	primary key(id, age)	#主键必须包含分区字段
    )ENGINE=InnoDB;
    
    partition by RANGE(age) (	#按年龄进行分区
     	partition p1 VALUES LESS THAN (20) DATA DIRECTORY = 'c:/data/p1',	#0~20
     	partition p2 VALUES LESS THAN (40) DATA DIRECTORY = 'c:/data/p2',	#20~40
     	partition p3 VALUES LESS THAN (60) DATA DIRECTORY = 'c:/data/p3',	#40~60
     	partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTORY = 'c:/data/p4'#60~max
    )ENGINE=InnoDB;
    
    • 主键必须包含分区字段

2. List分区

  • List分区是基于列值匹配一个离散值集合中的某个值来进行选择

  • 示例

    #List分区示例
    create table user_list(
    	id int not null auto_increment,
     	name varchar(30) ,
     	age int,
     	birthday date,
     	province int,
     	primary key(id, province)
    )ENGINE=InnoDB;
    
    partition by List(province) (
     	partition p1 VALUES IN (1,3,5,7,9,11,13,15,17,19,21), 	# 匹配离散值集合
     	partition p2 VALUES IN (2,4,6,8,10,12,14,16,18,20,22), 
     	partition p3 VALUES IN (23,24,25,26,27,28,29,30,31,32,33,34)
    );
    

3. Hash分区

  • Hash分区是基于用户定义的表达式的返回值来进行选择的分区。

    #Hash分区示例
    create table user_hash(
     	id int not null auto_increment,
     	name varchar(30) ,
     	age int,
     	birthday date,
     	province int,
     	primary key(id, birthday)
    )ENGINE=InnoDB;
    
    partition by HASH(YEAR(birthday))
    partitions 5;
    

4. Key分区

  • Key分区类似于Hash分区,但这里的Hash Key是由MySQL系统产生的

    #Key分区示例
    create table user_key(
     	id int not null auto_increment,
     	name varchar(30) ,
     	age int,
     	birthday date,
     	province int,
     	primary key(id, age)
    )ENGINE=InnoDB;
    
    partition by KEY (age) 
    partitions 5;
    

四、分区的其他操作

  • range分区的操作

    #新增分区
    alter table `user` add partition(partition p5 VALUES LESS THAN MAXVALUE);
    
    #对已存在的表进行分区
    alter table `user` partition by RANGE(age) (
     	partition p1 VALUES LESS THAN (20) DATA DIRECTORY = 'c:/data/p1',
     	partition p2 VALUES LESS THAN (40) DATA DIRECTORY = 'c:/data/p2',
     	partition p3 VALUES LESS THAN (60) DATA DIRECTORY = 'c:/data/p3',
     	partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTORY = 'c:/data/p4'
    );
    
    #删除分区(分区下的数据也会被删除)
    alter table `user` drop partition p5; 	
    
    #移除分区(数据不会被删除)
    ALTER TABLE `user` REMOVE PARTITIONING;	
    
  • 分区点类似索引,如果查询的时候查用于分区的字段,则只在指定分区中查找;否则要进行全表扫描

  • 数据量到达百万、千万级的时候,考虑用分区进行优化

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值