设为首页 加入收藏

TOP

MySQL分区总结
2015-12-15 22:18:08 来源: 作者: 【 】 浏览:3
Tags: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 ...语句。


格式如下:


注意:


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都可作为分区列。


格式如下:


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


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


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


LIST分区


LIST即列表分区。


格式如下:


LIST COLUMNS分区


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


格式如下:


多列格式如下:


HASH分区


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


格式如下:


注意:


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


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


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


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


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


LINEAR HASH分区


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


格式如下:


说明:


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值。


格式如下:


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


LINEAR KEY分区


LINEAR HASH分区类似。


格式如下:


总结:


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


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


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇论Oracle备库的设计方案 下一篇MySQL的loose index scan

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: