通俗地讲表分区是将一个大表,根据条件分割成若干个小表。mysql5.1开始支持数据表分区。
如:某用户表的记录超过了600万条仓储信息,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其它的条件分区。
首先看一下mysql中的year函数
如下图:

year函数会返回指定日期的年份。
RANGE分区
基于属于一个给定连续区间的列值,把多行分配给分区。
这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。看一个例子,如下:
CREATE TABLE part_tab (
c1 int default NULL,
c2 varchar(30) default NULL,
c3 date default NULL
)engine=INNODB PARTITION BY RANGE (year(c3) )(
PARTITION p3 VALUES LESS THAN (2000) ,
PARTITION p4 VALUES LESS THAN (2010) ,
PARTITION p11 VALUES LESS THAN MAXVALUE
) ;
上述代码解释,我们会对日期年份进行一个范围分区,如果年份小于2000,那么我们把这些mysql表数据放到我们的p3区;如果2000 <= 年份 < 2010,那么我们把这些mysql表数据放到我们的p4分区;如果2010 <= 年份 < MAXVALUE,那么我们就把这些mysql表数据放到我们的p11分区。
LIST分区
代码如下:
CREATE TABLE part_tab2 (
c1 int default NULL,
c2 varchar(30) default NULL,
c3 date default NULL
)engine=INNODB PARTITION BY LIST(year(c3) )(
PARTITION p1 VALUES IN (1999,2000) ,
PARTITION p2 VALUES IN (1998,2005) ,
PARTITION p2 VALUES IN (2010)
) ;
List分区需要把所有的列值都写出来。
HASH分区
代码例子如下:
CREATE TABLE part_tab3 (
c1 int default NULL,
c2 varchar(30) default NULL,
c3 date default NULL,
id INT NOT NULL
)engine=INNODB PARTITION BY HASH(id) PARTITIONS 4;
上面的代码会分为4个分区,通过id列的值通过mysql内部的哈希函数,mysql会为我们自动的计算出改行的分区,所以使用HASH分区的有点就是数据分布的会比较均匀,如果我们指定了4个分区,一共有1000条数据,最后应该每个区都差不多有250条左右。具体的hash算法是很复杂的,但mysql内部已经帮助我们写好了,所以我们不用太关心。