mysql 复合分区

1.以下面的排序为例子,对大数据的表进行复合分区,提高查询效率

2.这需求,如果不分区,查询sql很简单,首先,测试表的表结构如下

mysql 复合分区_第1张图片

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才支持这么查询。

你可能感兴趣的:(mysql)