通俗地讲表分区是将一个大表,根据条件分割成若干个小表。
mysql5.1开始支持数据表分区。如:某用户表的记录超过了600万条仓储信息,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。
为了改善大型表以及具有各种访问模式的表可伸缩性客观理性,和提高数据库效率
给定一个连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。
ALTER TABLE 表名(或者在建表语句之后插入一下语句)
partition by range (字段)
partition 分区名 values less than (字段值),//小于但不等于该字段值
partition 分区名values less than (字段值),
partition 分区名values less than (MAXVALUE)
ALTER TABLE titles
partition by range (year(from_date))
partition po1 values less than (1985),
partition po2 values less than (1986),
partition po3 values less than (1987),
partition po4 values less than (1988),
partition p05 values less than (1999),
partition p06 values less than (MAXVALUE)
类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中"expr"是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过过号分隔的整数列表。
举个栗子:
对于一个综合性的网店来说,商品分为诸多种类。我们可以按照商品D进行range分区,也可以按照商品的类型划分分区。在这个例子中,LIST分区给了我们更多的选择。
create table t2 (id int,cid int,name varchar(20),pos_datedatetime)
partition by list (cid)(
partition po1 values in (1,2,3),
partition po2 values in (4,5,6),
partition po3 values in (7,8,9))
create table t3 (id int,cid int,name varchar(20),pos_date datetime)
partition by hash (cid)
partitions 4;
create table t4 (id int,cid int,name varchar(20),pos_date datetime)
partition by linear hash(cid)
partitions 4;
- 按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的哈希函数是由MySQL服务器提供。MySQL簇(Cluster)使用函数MD5(来实现KEY分区;对于使用其他存储引擎的表,服务器使用其自己内部的哈希函数,这些函数是基于与PASSWORD()—样的运算法则。
create table t4 (id int,cid int,name varchar(20),pos_date datetime)
partition by linear key(cid)
partitions 4;
COLUMNS关键字允许字符串和日期列作为分区定义列,同时还允许使用多个列定义一个分区。
CREATE TABLE t6 ( a INT, b INT, c INT )
PARTITION BY RANGE COLUMNS ( a, b )(
PARTITION po1 VALUES less than ( 10, 10 ),//a小于10并且b小于10的分区,后面以此类推
PARTITION po2 VALUES less than ( 10, 20 ),
PARTITION po3 VALUES less than ( 10, 30 ),
PARTITION po4 VALUES less than ( 10, MAXVALUE ),
PARTITION po5 VALUES less than ( MAXVALUE, MAXVALUE ) );
第一个分区用来存储雇佣于1990年以前的女职员,第二个分区存储股用于1990-2000年之间的女职员,第三个分区存储所有剩下的女职员。对于分区p04到p06,我们策略是一样的,只不过存储的是男职员。最后一个分区是控制情况。
create table employees ( emp_no int,birth_date date, first_name varchar(20),last_name varchar(20),gender char(1),hire_date date)engine=myisam
partition by range columns(gender,hire__date)(
partition po1 values less than('F' ,'1990-01-01'),
partition po2 values less than('F','2000-01-01'),
partition po3 values less than ('F',maxvalue),
partition po4 values less than ('M', '1990-01-01'),
partition po5 values less than ('M' ,'2000-01-O1'),
partition po6 values less than ('M',maxvalue),
partition p07 values less than (maxvalue,maxvalue));
该表t5分成了6个分区
CREATE TABLE t5 (id int,udate DATE)
PARTITION BY RANGE(YEAR(udate))//根据date字段的年份进行分区
SUBPARTITION BY HASH(TO_DAYS(udate))//根据date字段的日期对分区后的表再进行分区
SUBPARTITIONS 2(
PARTITION po VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE);
语法规则:
1、每个分区必须有相等的子分区
2、如果在一个分区表上的任何分区上使用SUBPARTITION来明确定义任何子分区,那么就必须定义所有的子分区。