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) 就可以知道在 px 分区里,其中 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 及以上