1.以下面的排序为例子,对大数据的表进行复合分区,提高查询效率
2.这需求,如果不分区,查询sql很简单,首先,测试表的表结构如下
sql :
Select * from news_main order by news_click desc
3.为了避免大数据的性能问题,使用分区,并且这里使用list分区,按照news_class字段进行分区
alter table news_main PARTITION by list(news_class)
(
PARTITION class_java values in(1),#1java
PARTITION class_php values in(2),#2php
PARTITION class_python values in(3)#3python
)
这样,我们就能根据分类排序,sql :
select * from news_main partition(class_xxx) order by id desc
class_xxx由分区的参数决定
4.如果用户选择了年份,我们使用子分区,在分类下,再按年份,进行一次分区
a. range 和 list 都支持再次进行子分区切割,子分区支持hash和key。
b.hash分区,根据某列的值,均衡的分配到各个分区。
c.按年份分区 ,概念:数据均匀的分布到预定的各个分区中,保证各分区的数据数量大致一直
alter table news_main PARTITION by hash(year(news_adddate)) PARTITIONS 3
#写法2
alter table news_main PARTITION by hash(year(news_adddate)) PARTITIONS 3
(
PARTITION p0, #hash分区,这个可以略写,写了partition 3就可以了。
PARTITION p1,
PARTITION p2
)
d.如何判定数据分布到哪一个分区?
比如,我们分了3个区,只要计算 select mod(year,3),就可以知道,在px分区里,其中,year是参数;
算出来之后,使用 select * from news_main partition(px);
5.复合分区的写法
alter table news_main PARTITION by list(news_class) SUBPARTITION by hash(year(news_adddate)) SUBPARTITIONS 3
(
PARTITION class_java values in(1) ,
PARTITION class_php values in(2),
PARTITION class_python values in(3)
)
子分区的分区名是: 上级分区+s+p+mod(值,分区的数量),比如,取2014,news_class是1的sql,
select * from news_main partition(classjavasp1);
#1 select * mod(2014,3) = 1
这种方法,在mysql5.6.2才支持这么查询。