mysql建表分区按天_将按月分区的表改为按天分区

xulijia

随着业务的快速发展,数据库中表的数据增量也会明显上升,之前一个月只有10w数据的,现在可能一天就有10w,这个时候如果还是按照以前按月分区的策略进行访问,那么sql扫描单个分区要访问300w的数据,为了保证效率,可以将表改为按天分区,并对sql谓词条件进行调整使得只访问单天的一个分区,这样性能就得到了保证。

一般来说,按月分区的表都是range分区,下面来介绍将按月分区改为按天分区的方法:

1.range间隔分区的情况

间隔分区无法手工add partition ,会出现如下报错:

ORA-14760 ADD PARTITION is not permitted on Interval partitioned objects

思路是先改为非间隔分区 ,然后手工按天add partition ,并建议再改成按天间隔,详见如下案列:

create table tmp_test_range

(

id number,

name varchar2(30),

int_date date

)

PARTITION BY RANGE(int_date)

interval(NUMTOYMINTERVAL (1,'MONTH'))

(

partition P201511 values less than(to_date('20151201','yyyymmdd')),

partition P201512 values less than(to_date('20160101','yyyymmdd')));

ALTER TABLE tmp_test_range SET INTERVAL ();

alter table tmp_test_range add partition P20160101 values less than(to_date('20160102','yyyymmdd'));

ALTER TABLE tmp_test_range SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));

2.range非间隔分区的情况

思路是删除一些还没有使用的月分区,然后手工按天add partition ,并建议再改成按天间隔

create table tmp_test_range

(

id number,

name varchar2(30),

int_date date

)

PARTITION BY RANGE(int_date)

(

partition P201511 values less than(to_date('20151201','yyyymmdd')),

partition P201512 values less than(to_date('20160101','yyyymmdd')),

partition P201601 values less than(to_date('20160201','yyyymmdd')));

alter table tmp_test_range drop partition P201601;

alter table tmp_test_range add partition P20160101 values less than(to_date('20160102','yyyymmdd'));

ALTER TABLE tmp_test_range SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));

注意range分区表添加分区并不影响全局索引和本地分区索引,也不影响当前分区表的任何操作

但修改interval的属性会造成短暂的锁并引起相关sql游标失效


版权声明:本文为weixin_32021519原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。