微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL分区总结

MysqL支持RANGE,LIST,HASH和KEY四种分区。其中,每个分区又都有一种特殊的类型。对于RANGE分区,有RANGE COLUMNS分区。对于LIST分区,有LIST COLUMNS分区。对于HASH分区,有LINEAR HASH分区。对于KEY分区,有LINEAR KEY分区。具体如下:

 

RANGE分区

RANGE即范围分区,根据区间来判断位于哪个分区,譬如,在下例中,如果store_id小于6,则新增或修改的记录会被分配到p0分区,如果大于6小于11,则记录会被分配到p1分区,依次类推。类似于编程语言中的if ... elseif ...语句。

格式如下:

CREATE TABLE employees (
    id INT NOT NULL,fname VARCHAR(30),lname NULL DEFAULT '1970-01-01'arated DATE 9999-12-31
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (61116VALUES LESS THAN MAXVALUE
);

注意:

1. RANGE分区的返回值必须为整数。

2. PARTITION p3 VALUES LESS THAN MAXVALUE 是非必需的。

 

RANGE COLUMNS分区

RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE分区的区别如下:

1. RANGE COLUMNS不接受表达式,只能是列名。而RANGE分区则要求分区的对象是整数。

2. RANGE COLUMNS允许多个列,在底层实现上,它比较的是元祖(多个列值组成的列表),而RANGE比较的是标量,即数值的大小。

3. RANGE COLUMNS不限于整数对象,date,datetime,string都可作为分区列。

格式如下:

 rcx (
    a INTCHAR(3 RANGE COLUMNS(a,d,c) (
    PARTITION p0 5,10,ggg20,1)">mmmm15,1); font-weight: bold">30,1)">sss LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
);

同RANGE分区类似,它的区间范围必须是递增的,有时候,列涉及的太多,不好判断区间的大小,可采用下面的方式进行判断:

MysqL> SELECT (10) < (12),(11) 12) 12);
+-----------------+-----------------+-----------------+
| (|
|               1 0 1 row in set (0.07 sec)

关于RANGE COLUMNS的更多说明,可参考MysqL官方文档:

http://dev.mysql.com/doc/refman/5.6/en/partitioning-columns-range.html

 

LIST分区

LIST即列表分区。

格式如下:

 LIST(store_id) (
    PARTITION pnorth VALUES IN (3,1); font-weight: bold">6,1); font-weight: bold">9,1); font-weight: bold">171,1); font-weight: bold">2,1); font-weight: bold">11,1); font-weight: bold">19,1); font-weight: bold">204,1); font-weight: bold">12,1); font-weight: bold">13,1); font-weight: bold">14,1); font-weight: bold">187,1); font-weight: bold">8,1)">)
);

 

LIST COLUMNS分区

LIST COLUMNS分区同样是LIST分区的一种特殊类型,它和RANGE COLUMNS分区较为相似,同样不接受表达式,同样支持多个列支持string,date和datetime类型。

格式如下:

 customers_1 (
    first_name 2515renewal DATE
)
PARTITION  LIST COLUMNS(renewal) (
    PARTITION pWeek_1 IN(2010-02-01',1)">2010-02-022010-02-032010-02-042010-02-052010-02-062010-02-072010-02-082010-02-092010-02-102010-02-112010-02-122010-02-132010-02-142010-02-152010-02-162010-02-172010-02-182010-02-192010-02-202010-02-212010-02-222010-02-232010-02-242010-02-252010-02-262010-02-272010-02-28)
);

多列格式如下:

 customers_2 (
    first_name  LIST COLUMNS(city,last_name,first_name) (
    PARTITION pRegion_1 IN ((OskarshamnHögsbyMönsterås'),(NässjöEksjöVetlanda)),PARTITION pRegion_2 IN((VimmerbyHultsfredVästervikUppvidingeAlvestaVäxjo))
);

 

HASH分区

和RANGE,LIST分区不同的是,HASH分区无需定义分区的条件。只需要指明分区数即可。

格式如下:

 HASH(store_id)
PARTITIONS 4;

注意:

1. HASH分区可以不用指定PARTITIONS子句,如上文中的PARTITIONS 4,则认分区数为4。

2. 不允许只写PARTITIONS,而不指定分区数。

3. 同RANGE分区和LIST分区一样,PARTITION BY HASH (expr)子句中的expr返回的必须是整数值。

4. HASH分区的底层实现其实是基于MOD函数。譬如,对于下表

TABLE t1 (col1 INT,col2 5BY HASH( YEAR(col3) )
    PARTITIONS 4;

如果你要插入一个col3为“2005-09-15”的记录,则分区的选择是根据以下值决定的:

MOD(YEAR(2005-09-014)
=  MOD(2005,1)">=  1

 

LINEAR HASH分区

LINEAR HASH分区是HASH分区的一种特殊类型,与HASH分区是基于MOD函数不同的是,它基于的是另外一种算法。

格式如下:

BY LINEAR HASH( (hired) )
PARTITIONS 4;

说明:

1. 它的优点是在数据量大的场景,譬如TB级,增加删除、合并和拆分分区会更快,缺点是,相对于HASH分区,它数据分布不均匀的概率更大。

2. 具体算法,可参考MysqL的官方文档

http://dev.mysql.com/doc/refman/5.6/en/partitioning-linear-hash.html

 

KEY分区

KEY分区其实跟HASH分区差不多,不同点如下:

1. KEY分区允许多列,而HASH分区只允许一列。

2. 如果在有主键或者唯一键的情况下,key中分区列可不指定,认为主键或者唯一键,如果没有,则必须显性指定列。

3. KEY分区对象必须为列,而不能是基于列的表达式。

4. KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。

格式如下:

 k1 (
    id PRIMARY KEY)
)
PARTITION BY ()
PARTITIONS 2;

在没有主键或者唯一键的情况下,格式如下:

 tm1 (
    s1 32(s1)
PARTITIONS 10;

 

LINEAR KEY分区

LINEAR HASH分区类似。

格式如下:

 tk (
    col1 BY LINEAR  (col1)
PARTITIONS 3;

 

总结:

1. MysqL分区中如果存在主键或唯一键,则分区列必须包含在其中。

2. 对于原生的RANGE分区,LIST分区,HASH分区,分区对象返回的只能是整数值。

3. RANGE COLUMNS,LIST COLUMNS,KEY,LINEAR KEY分区对象只能是列,不能是基于列的表达式。

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐