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多平台发布

相关推荐
南城花随雪。4 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了5 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度7 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮9 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...2 小时前
索引(MySQL)
数据库·mysql·索引
菠萝咕噜肉i2 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁