01
---------------
分区介绍
所谓的表分区,是指将一张逻辑上的大表按照一定规则从行或者列的角度来进行分割,形成多张物理小表[分区表]。从应用的角度来看,所有分区表组成一张逻辑主表,分区对应用透明;从数据存储的角度来看,每个分区表的数据都存储在单独的物理文件上。
MySQL从5.1版本开始实现分区的功能。MySQL的分区功能是在server层实现的,并没有下推到存储引擎层来实现;在其支持的众多存储引擎中,csv、fedorated、merge等目前不支持分区,其他的存储引擎比如InnoDB、MyISAM都支持分区功能[注:MySQL5.7.28版本之后,只有InnoDB存储引擎支持分区]。下图展示了InnoDB存储引擎的分区表,前面3个以.idb结尾的文件表示一张逻辑主表的三张分区表,最后一个文件则是没有进行分区的数据文件,从下图可以发现,分区表的数据文件命名方式按照table_name#partition_name的格式命名,而没有进行分区的数据文件则直接用table_name。

02
---------------
分区类型
MySQL支持多种类型的分区,包括:Range分区、List分区、Key分区、Hash分区。在确定数据应该被存入哪个分区时,通过将分区列的值传给分区表达式,根据分区表达式返回的值来确认数据应该存入的分区。下面分别对每一种分区进行简要介绍,在接下来的推送中,会对每一种分区的创建、更新、删除进行详细介绍:
1)Range分区:根据分区列的值进行分区。在定义分区时,每个分区的范围应该是连续、不重复的值域。通过partition partition_name values less than (val)来确定数据命中的分区。
3)Key分区:采用MySQL内部提供的hash函数来计算数据应该存入的分区。
4) Hash分区:采用用户提供的Hash函数来计算数据应该被存入的分区,hash函数的返回值不能为负值。
需要特别说明的是,无论创建什么类型的分区,如果表结构定义时包含主键或者唯一索引,则分区列必须时主键或者唯一索引的一部分,否则,在创建分区时将会报错;下图展示几个分区表的创建实例。

图1

图2

图3
在图1中,主键为col_2,但分区列为col_1,建表时返回如图所示错误;在图2中,同时定义了主键和唯一索引,但主键和唯一索引没有公共的列,这个表无论如何创建分区,都会报错;第三张表的结构跟第二张表一致,但主键和唯一索引包含公共的列col_2,此时使用col_2作为分区列即可成功创建分区表。





