mysql分区

概述:

表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

优点:

1.分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。

2.和单个磁盘或者文件系统相比,可以存储更多数据。

3.优化查询,在where语名中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语名时,也可以在多个分区上并行处理,最后汇总结果。

5.可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问。


限制:

1.一个表最多只能有1024个分区。

2.MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。

3.如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。

4.分区表中无法使用外键约束。

5.MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。


分区的类型及举例:

1.范围分区

range分区:基于属于一个给定连续区间的列值,把多行分配给分区。如时间,连续的常量值等

create table range_p(
	range_p_id int(11),
	name char(12) not null,
	credate datetime
) partition by range(year(credate))(
	PARTITION p211 values less than (2011),
	PARTITION p212 values less than (2012),
	PARTITION p213 values less than (2013),
	PARTITION p214 values less than (2014),
	PARTITION p215 values less than MAXVALUE
)

range覆盖问题:当插入的记录中对应的分区键值不在分区定义的范围中的时侯,插入语句会失败,如果分区的键值为null,将作为一个最小值来处理。


2.列举分区

list分区:类似于按range分区,区别在于list分区是基于列值区配一个离散值集合中的某个值

create table list_p(
	list_p_id int(11),
	name char(12) not null,
	sex int(1) not null,
	monsalary decimal(10, 2),
	credate datetime
) PARTITION by list(sex) (
	PARTITION psex1 values in(1),
	PARTITION psex2	VALUES in(2)
);

注意:如果插入的记录对应的分区键的值不在list分区指定的值中,将会插入失败。并且,list不能像range分区那样提供maxvalue, 以及list只能是数字。


3.离散分区

hash分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含>,产生非负整数值的任何表达式。

create table hash_p(
	hash_p_id int(11),
	name char(12) not null,
	sex int(1) not null,
	monsalary decimal(10, 2),
	credate datetime
) PARTITION by HASH (hash_p_id)
partitions 8;

4.键值分区

key分区:类似于按hash分区,区别在于key分区只支持计算一列或多列,且mysql服务器提供自身的哈希函数。必须有一列或多列包含>整数值。

create table key_p(
	hash_p_id int(11),
	name char(12) not null,
	sex int(1) not null,
	monsalary decimal(10, 2),
	credate datetime
) PARTITION by key (hash_p_id)
partitions 8;

5.columns分区(5.5开始支持)

.columns分区:可视为RANGE和LIST分区的进化,COLUMNS分区可以直接使用非整形数据进行分区。COLUMNS分区支持以下数据类型:
所有整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL则不支持。
日期类型,如DATE和DATETIME。其余日期类型不支持。
字符串类型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT类型不支持。
COLUMNS可以使用多个列进行分区。

reate table columns_p(
	hash_p_id int(11),
	name char(12) not null,
	sex int(1) not null,
	monsalary decimal(10, 2),
	credate datetime
) PARTITION by RANGE COLUMNS(credate)(
	partition p20151 values less than ('2015-04-01'), 
	partition p20152 values less than ('2015-07-01'), 
	partition p20153 values less than ('2015-10-01'), 
	partition partlog values less than maxvalue 
);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值