【mysql实战】利用复合分区在大数据表中实现按人气、分类和年份联合条件查询

Select * from news_main order by news_click desc 

1、为了避免大数据的性能问题,我们就要使用分区,并且使用 list 分区,这里我们把每个分类(java、php、python)分成一个新区,new_class 字段必须设为联合主键

alter table news_main PARTITION by list(news_class)
(
   PARTITION class_java values in(1),
   PARTITION class_php values in(2),
   PARTITION class_python values in(3)
)

如果用户选择了分类,则:

 select * from news_main PARTITION(class_xxxx) order by id desc

 class_xxx 由参数决定。

2、如果用户选择了年份,为了模拟大数据,我们要用到子分区。

range 和 list 分区都支持再次进行子分区切割,子分区支持 hash 和 key。

3、先来了解一下 hash 分区。

根据某列的值均衡的分配到各个分区。

alter table news_main PARTITION by hash(year(news_adddate)) PARTITIONS 3
(
   PARTITION p0,
   PARTITION p1,
   PARTITION p2
)

概念:数据均匀的分布到预先定义的各个分区中,保证各分区的数据数量大致一致。

3、如何判定数据分到了哪个分区?

譬如我们分了3个分区,则只要计算mod(year,3) 就可以知道在 p分区里,其中 year 是参数。

算出来后,我们就可以使用: select * from news_main PARTITION(px)

4、子分区语法

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)
  )  

news_adddatae 需要设置为联合主键,且类型不能是 timestamp,要用 datetime。

子分区的分区名就是:上级分区名 + s + p + mod(值,分区的数量)

5、注意事项

mysql 版本需要 5.6.2 及以上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值