MySQL分区

MySQL分区

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

分区的类型

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

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

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

创建分区

RANGE分区

mysql 复制代码
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分区

sql 复制代码
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分区

sql 复制代码
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分区

sql 复制代码
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;

分区信息及数据

查看表的分区信息

sql 复制代码
select * from information_schema.partitions where 
table_schema='company' and table_name='test_staff_partition'

查看某个分区的数据

sql 复制代码
select * from test_staff_partition partition(p3)

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

sql 复制代码
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分区

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

sql 复制代码
alter table test_staff_partition drop partition p0;

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

sql 复制代码
 alter table test_staff_partition remove partitioning;

对于hash和key分区

sql 复制代码
alter table test_staff_partition_hash COALESCE PARTITION 2;

增加分区

对于range和list分区

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

对于hash和key分区

sql 复制代码
alter table test_staff_partition_hash add PARTITION partitions 2;

重新分区

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

sql 复制代码
ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO 
(partition_definitions)

重建分区

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

sql 复制代码
alter table test_staff_partition REBUILD PARTITION p2,p3;

优化分区

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

sql 复制代码
alter table test_staff_partition OPTIMIZE PARTITION p2,p3;

分析分区

读取并保存分区的键分布

sql 复制代码
alter table test_staff_partition ANALYZE PARTITION p2,p3;

检查分区

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

sql 复制代码
alter table test_staff_partition CHECK PARTITION p2,p3;

修补分区

修补被破坏的分区

sql 复制代码
alter table test_staff_partition REPAIR PARTITION p2,p3;

分区的好处

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

zhhll.icu/2021/数据库/关系...

本文由mdnice多平台发布

相关推荐
Java探秘者2 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
2301_786964363 小时前
3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例
java·大数据·数据库·分布式·hbase
阿维的博客日记4 小时前
图文并茂解释水平分表,垂直分表,水平分库,垂直分库
数据库·分库分表
wrx繁星点点4 小时前
事务的四大特性(ACID)
java·开发语言·数据库
小小娥子5 小时前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
DieSnowK5 小时前
[Redis][集群][下]详细讲解
数据库·redis·分布式·缓存·集群·高可用·新手向
-XWB-6 小时前
【MySQL】数据目录迁移
数据库·mysql
老华带你飞6 小时前
公寓管理系统|SprinBoot+vue夕阳红公寓管理系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·课程设计
我明天再来学Web渗透6 小时前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法
Data 3176 小时前
Hive数仓操作(十一)
大数据·数据库·数据仓库·hive·hadoop