以前一直想到大数据优化是分库分表,但分库分表需要自己在代码中来逻辑判断,即既要实现逻辑分库分表,又要实现物理分库分表。mysql的分区就是为了解决这个问题的。直接在物理上实现分表,但是在代码逻辑上好像就是一个表样,不需要额外通过代码判断.
分区有四种,而我们常用到的就是三种:range,list,hash.当然还有key.其中又以range和list最常用,list其实是range的一个特例
1.hash:主要是测试用,将表平均分成几个表。
2.list:主要是针对对应字段的枚举来分区:比如:年级在一年级和二年级为一个区,三年级,四年级和五年级又分到一个区
3.range主要是根据给定区间来分区,比如id<10000为一个区,10000到20000为一个区。
eg:
a.range:
create table t(id int,birth DATE NOT NULL DEFAULT '1970-01-01')partition by range(YEAR(birth))(
partition p0 values less than (1991),
partition p1 values less than (2000),
partition p2 values less than (2001),
partition p0 values less than maxvalue
)
b.list:
create table t(id int,store_id int)partition by list(store_id)(
partition p0 values in (1,3),
partition p1 values in (2),
partition p2 values in(5,9)
)
c.hash:
create table t(id int,birth DATE NOT NULL DEFAULT '1970-01-01')partition by hash(id) partitions 4;
这样就实现了在物理上把一张很大的表分成了几个区。逻辑上还是查一个表。但实际上,比如range,在查询的时候,如果条件满足,就直接查其中的一个分区,而这个分区的数据肯定没有原表那么大。达到提速的要求。
最后注意的是,innodb默认是共享表空间的,所以要对innodb执行分区的化,要在配置文件里,把innodb_file_per_table=1这样,innodb就变成了独立表空间,可以正常分区了。