MySQL分区

码界星芒
• 阅读 190

MySQL分区

分区就是将一个表分解成多个区块进行操作和保存,从而降低每次操作的数据,提高性能。而对应用来说是透明的,从逻辑上看是只有一个表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是一个独立的对象,可以进行独立处理

分区的类型

  • RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区
  • LIST分区:类似于按RANGE分区,LIST是列值匹配一个离散值集合中的某个值来进行选择
  • HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算,这个函数必须产生非负整数值
  • KEY分区:类似于按HASH分区,由MySQL服务器提供其自身的哈希函数

注:如果表中存在primary key或者unique key时,分区的列必须是primary key或者unique key的一个组成部分,也就是说,分区函数的列只能从pk或者uk这些key中取子集

如果表中不存在任何的primary key或者unique key,则可以指定任何一个列作为分区列

<!-- more -->

创建分区

RANGE分区

CREATE TABLE `test_staff_partition` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY RANGE (id) (
    PARTITION p0 VALUES LESS THAN (5),
    PARTITION p1 VALUES LESS THAN (10),
    PARTITION p2 VALUES LESS THAN (15),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

LIST分区

CREATE TABLE `test_staff_partition_list` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY List (id) (
    PARTITION p0 VALUES in (1,2,3,5),
    PARTITION p1 VALUES in (7,9,10),
    PARTITION p2 VALUES in (11,15)
);

HASH分区

CREATE TABLE `test_staff_partition_hash` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY HASH (id)
PARTITIONS 3;

由于每次插入、更新、删除一行,这个表达式都要计算一次;这意味着非常复杂的表达 式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候

KEY分区

CREATE TABLE `test_staff_partition_key` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY LINEAR Key (id)
PARTITIONS 3;

分区信息及数据

查看表的分区信息

select * from information_schema.partitions where 
table_schema='company' and table_name='test_staff_partition'

查看某个分区的数据

select * from test_staff_partition partition(p3)

在使用分区键进行查询时,会只查该分区键所处的分区

explain select * from test_staff_partition where id = 4

id    select_type    table    partitions    type    possible_keys    key    key_len    ref    rows    filtered    Extra
1      SIMPLE    test_staff_partition    p0    const    PRIMARY     PRIMARY    4      const    1       100.00    

分区管理

删除分区

对于range和list分区

当删除了一个分区,也同时删除了该分区中所有的数据

alter table test_staff_partition drop partition p0;

也可以删除所有的分区但是保留数据

 alter table test_staff_partition remove partitioning;

对于hash和key分区

alter table test_staff_partition_hash COALESCE PARTITION 2;

增加分区

对于range和list分区

alter table test_staff_partition add partition(partition p3 values LESS THAN (20));
  • 对于RANGE分区的表,只可以添加新的分区到分区列表的高端
  • 对于List分区的表,不能添加已经包含在现有分区值列表中的任意值

对于hash和key分区

alter table test_staff_partition_hash add PARTITION partitions 2;

重新分区

可以在不丢失数据的条件下重新定义分区

ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO 
(partition_definitions)

重建分区

类似于先删除保存在分区中的所有记录,然后重新插入它们,可用于整理分区碎片

alter table test_staff_partition REBUILD PARTITION p2,p3;

优化分区

如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB,或TEXT类型的列)作了许多修改,可以使用“ALTER TABLE ... OPTIMIZE PARTITION”来收回没有使用的空间,并整理分区数据文件的碎片。

alter table test_staff_partition OPTIMIZE PARTITION p2,p3;

分析分区

读取并保存分区的键分布

alter table test_staff_partition ANALYZE PARTITION p2,p3;

检查分区

检查分区中的数据或索引是否已经被破坏

alter table test_staff_partition CHECK PARTITION p2,p3;

修补分区

修补被破坏的分区

alter table test_staff_partition REPAIR PARTITION p2,p3;

分区的好处

  • 进行逻辑数据分割,分割数据能够有多个不同的物理文件路径
  • 可以存储更多的数据,突破系统单个文件最大限制
  • 提升性能,提高每个分区的读写速度,提高分区范围查询的速度
  • 可以通过删除相关分区来快速删除数据
  • 通过跨多个磁盘来分散数据查询,从而提高磁盘I/O的性能
  • 涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理
  • 可以备份和恢复独立的分区,这对大数据量很有好处
https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/26.MySQL分区/

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
Ubuntu的Linux逻辑卷管理
LVM(逻辑卷)管理系统可以将多个物理磁盘组装为一个大的逻辑磁盘进行使用,尤其是管理大文件时非常方便。LVM可以减少多个磁盘的部分空间闲置的情况,集中使用提高磁盘利用率。LVM的卷可以动态伸缩,方便使用。LVM由PV(物理卷)、VG(卷组)、LV(逻辑卷)组成,其中PV对应到物理磁盘的一个物理分区,LV相当于一个逻辑分区,VG建立起逻辑卷和物理卷之间的对
Wesley13 Wesley13
3年前
mysql之数据分区
一:概述 通过把表分成多几区间,每个区间存储符合特定表达式的数据(即在我们创建分区表时指定每个分区存储的条件例如:PARTITIONp0VALUESLESSTHAN(100)即p0区间存储小于100的数据)。二:分区类型   即根据每个区间存储值的表达式不同,可分为如下几个类型,一般都是对数字类型或时间类型的数据进行分区。2.1 R
Stella981 Stella981
3年前
Apache Hudi重磅RFC解读之记录级别全局索引
1\.摘要Hudi表允许多种类型操作,包括非常常用的upsert,当然为支持upsert,Hudi依赖索引机制来定位记录在哪些文件中。当前Hudi支持分区和非分区的数据集。分区数据集是将一组文件(数据)放在称为分区的桶中的数据集。一个Hudi数据集可能由N个分区和M个文件组成,这种组织结构也非常方便hive/presto/sp
Wesley13 Wesley13
3年前
Mysql 表分区分类
针对Mysql数据库,表分区类型简析。【1】表分区类型(1)Range分区:按范围分区。按列值的范围区间进行分区存储;比如:id小于10存储在一个分区;id大于10小于20存储在另外一个分区;(2)List分区:按离散值集合分区。与range分区类似,不过它是按离散值进行分区。(3)Hash分区:按hash算法结果分区。对用户定义的表达式所返
Stella981 Stella981
3年前
PostgreSQL从继承到分区(二)
二、Partitioning\_table2.1关于分区表借助表的继承特性PostgreSQL实现了分区表功能,虽然相比Oracle、MySQL的分区表来说其实现过程比较麻烦,但是这种方式同样能达到分区的效果,而且对大表的查询优化效果很明显。PostgreSQL的分区表概念与其它数
Stella981 Stella981
3年前
Spark学习之路 (十七)Spark分区
一、分区的概念  分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个数,也是由RDD(准确来说是作业最后一个RDD)的分区数决定。二、为什么要进行分区  数据分区,在分布式
Wesley13 Wesley13
3年前
HGDB分区表的使用与管理
目录文档用途详细信息文档用途了解HGDB分区表的简单使用详细信息1.简介数据库表分区把一个大的物理表分成若干个小的物理表,并使得这些小物理表在逻辑上可以被当成一张表来使用。一般来讲我们把上述说明中的大的物理表称为父表/主表,小的物理表称为子表/分区表。主表/父表/MasterTable 该表是创建子表的模板。它是
Stella981 Stella981
3年前
Linux系统分区方式
硬盘在使用之前,要进行分区、格式化一个硬盘可以分主分区、扩展分区、逻辑分区    主分区扩展分区<4,可以全部设置成主分区,也可以主分区扩展分区进行设置,扩展分区不能直接使用,需要在扩展分区上建立逻辑分区,逻辑分区可以有多个  主分区扩展分区编号14  逻辑分区编号只能从5开始
Stella981 Stella981
3年前
Kafka 中的消息存储在磁盘上的目录布局是怎样的?
Kafka中的消息是以主题为基本单位进行归类的,各个主题在逻辑上相互独立。每个主题又可以分为一个或多个分区,分区的数量可以在主题创建的时候指定,也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配一个唯一的序列号,也就是通常所说的偏移量(offset),具有4个分区的主题的逻辑结构见下图。!(http
Wesley13 Wesley13
3年前
MySQL 分区表原理及使用详解
1\.什么是表分区?表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。2\.表分区与分表的区别分表:指的是通过一定规则,将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。分表与分区的区别在于:
Wesley13 Wesley13
3年前
Mysql合并表原理
1.概述:合并表是一种早期的、简单的分区实现,和分区表相比有一些不同的限制,并且缺乏优化。分区表严格来说是一个逻辑上的概念,用户无法访问底层的各个分区,对用户来说分区是透明的。但是合并表允许用户单独访问各个子表。分区表和优化器的结合更紧密,这也是未来发展的趋势,而合并表则是一种将要被淘汰的技术,在未来的版本中可能被删除。2.原理:
码界星芒
码界星芒
Lv1
方舟安可极,离思故难任!
文章
4
粉丝
0
获赞
0