分区简介
分区是根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的对象,可以独立处理,可以作为表的一部分进行处理。分区对应用来说是完全透明的,不影响应用的业务逻辑。
分区有利于管理非常大的表,它采用分而治之的逻辑,分区引入了分区键的概念,分区键用于根据某个区间值(或者范围值)、特定值列表或者 hash函数值执行数据的聚集,让数据根据规则分布在不同的分区中,让一个大对象变成多个小对象。
Mysql分区既可以对数据进行分区也可以对索引进行分区。
MySQL分区表对分区字段的限制
分区的字段,必须是表上所有的唯一索引(或者主键索引)包含的字段的子集。
换句话说:(所有的)字段必须出现在(所有的)唯一索引或者主键索引的字段中,或者说:一个表上有一个或者多个唯一索引的情况下,分区的字段必须被包含在所有的主键或者唯一索引字段中。
分区类型
range分区:基于一个给定的连续区间范围(区间要求连续并且不能重叠),把数据分配到不同的分区
list分区:类似于range分区,区别在于list分区是基于枚举出的值列表分区,range是基于给定的连续区间范围分区
hash分区:基于给定的分区个数,把数据分配到不同的分区
key分区:类似于hash分区
MySQL分区的优点主要包括以下4个方面
1)和单个磁盘或者文件系统分区相比,可以存储更多数据
2)优化查询。在where子句中含有分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率;同时,在设计sum()和count() 这类聚合函数查询时,可以容易的在每个分区上并行处理,最终只需要汇总所有分区得到的结果
3)对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据
4)跨多个磁盘来分散数据查询,以获得更大的查询吞吐量
分区和水平分表功能类似,将一个大表的数据分割到多张小表中去,由于查询不需要全表扫描了,只要扫描某些分区,所以分区能提高查询速度。
水平分表需要用户预先手动显式创建出多张分表(如 tbl_user0,tbl_user1,tbl_user2),在物理上实实在在的创建多张表,通过客户端代理(Sharding-JDBC等)或者中间件代理(mycat等)来实现分表逻辑。
分区是Mysql的一个插件Plugin功能,将一张大表的数据在数据库底层分成多个分区文件(如 tbl_user#P#p0.ibd,tbl_user#P#p1.ibd,tbl_user#P#p2.ibd),和水平分表不同的是分区不需要显示的创建“分表”,数据库会自动创建分区文件,用户看到的只是一张普通的表,其实是对应的多个分区,这个是对用户是屏蔽、透明的,在使用上和使用一张表完全一样,不需要借助任何功能来实现。分区是一种逻辑上的水平分表,在物理层面还是一张表。
数据库文件
create table tbl_user_innodb(
id int(11) not null auto_increment,
username varchar(255),
email varchar(20),
age tinyint(4),
type int(11),
create_time datetime default current_timestamp,
primary key (id)
) engine=InnoDB auto_increment=5100002;
create table tbl_user_myisam(
id int(11) not null auto_increment,
username varchar(255),
email varchar(20),
age tinyint(4),
type int(11),
create_time datetime default current_timestamp,
primary key (id)
) engine=myisam auto_increment=5100002;
通过show variables like ‘