Mysql优化-分区

时间:2022-02-26 01:29:38

Mysql优化-分区

 

分区简介

  分区是根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有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 ‘