一、概念
1. 分区命名:分区名字不区分大小写
2. 无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录
3. 创建分区
create table tbl_users(
uuid int not null,
customerId varchar(20),
pwd varchar(20),
showName varchar(100),
trueName varchar(100),
registerTime varchar(100)
)
partition by range(uuid)(
partition p0 values less than(5),
partition p1 values less than(10),
partition p2 values less than(15),
partition p3 values less than maxvalue
);
4.
①:到存放数据的地方查看文件,路径配置在/usr/bin/mysql.config里面的ldata
②:可以通过使用形如:select * from information schema.partitions where table_schema='arch1' and table_name='tbl_users' G; 的语句来查看分区信息
③:可以通过形如:select * from tbl_users partition(p0);语句来查看分区上的数据
④:可以使用形如explain partitions select * from tbl_users where uuid=2;语句来查看Mysql会操作的分区
5. List分区
partition by list(uuid)( partition p0 values in (1,2,3,5), partition p1 values in (7,9,10), partition p2 values in (11,15) );
①:如果试图操作的列值不在分区值列表中时,那么会失败并报错(error 1526(hy000):table has no partition for value 8)。要注意的是,list分区没有类似如“values less than maxvalue”这样的保函其他值在内的定义,将要匹配的任何值都必须在值列表中找到。
②:list分区除了能和Range分区结合起来生成一个复合的子分区,与hash和key分区结合起来生成复合的子分区也是可以的
6. Hash分区
Hash分区主要用来确保数据在预先确定数目的分区中平均分布。在Range和List分区中,必须明确指定一个给定的列值或列值集合以指定应该保存在哪个分区;而在Hash分区中,musql自动完成这些工作,要做的只是基于将要被哈希的列值指定一个表达式,以及指定被分区的表将要被分割成的分区数量,如:
partition by hash(uuid) partitions 3;
(1):由于每次插入、更新、删除一行,这个表达式都要计算一次;这意味着非常复杂的表达式(uuid)可能引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候;
(2):最有效的哈希函数是只对单个表进行计算,并且它的值随列值进行一致的增大或减小,因为这考虑了在分区范围伤的“修剪”。也就是说,表达式值和它所基于的列的值变化越接近,就能越有效的使用该表达式来进行hash分区
7. 子分区
子分区是分区表中每个分区的再次分割,适合保存非常大量的数据
partition by range(year(registerTime)) subpartition by hash(to_days(registerTime)) subpartitions 2
(
partition p0 values less than(2008),
partition p1 values less than(2015),
partition p2 values less than maxvalue
);
(1)在Mysql5.1中,对于已经通过range或list分区了的表再进行子分区是可能的。子分区既可以使用Hash分区,也可以使用key分区,这也被称为复合分区
(2)每个分区必须有相同数量的子分区
(3)如果在一个分区表上的任何分区上使用subpartition 来明确定义任何子分区,那么就必须定义所有的子分区
(4)每个subpartition子句必须包括(至少)子分区的一个名字