分区
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。
表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据大大提高了数据查询的速度。
表分区的优缺点
优点:
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义
一、mysql分区
1.1分区表结构
CREATE TABLE `cb_ba_trade_detail_third` (
`ID_` bigint(20) NOT NULL AUTO_INCREMENT,
`ACCOUNTID_` bigint(20) DEFAULT NULL,
`TRADETIME_` timestamp ,
`hasPush_` int(1) DEFAULT NULL COMMENT '是否执行过推送App任务 1 是 执行过 0否,空否',
PRIMARY KEY (`ID_`,`TRADETIME_`) USING BTREE,
KEY `TRADE_DETAIL_ACCOUNTID_` (`ACCOUNTID_`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=16421 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
PARTITION BY RANGE ( UNIX_TIMESTAMP(TRADETIME_) ) (
PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2021-09-20') )
);
这里截取了部分关键字段,总体意思就是将时间戳的字段也要设置为主键,然后在建表后增加
PARTITION BY RANGE ( UNIX_TIMESTAMP(TRADETIME_) ) (
PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2021-09-20') )
);
1.2、分区的增加,和删除,和查看分区信息
1.2.1 增加分区
alter table cb_ba_trade_detail_third add partition (partition p1 values less than (unix_timestamp('2021-10-01')));
1.2.1.1、
这里的p1,指的是分区的名称,名称可以自定义,建议更改为日期的分区时间例如“2021-10-01”,这样使用sql查看分区数据时非常好用,
1.2.1.2、
这里的日期指定的是小于xxxx年xx月xx日,例如系统存入日期为”2021-09-29”的数据分区表自动会将此数据存储在该p1分区,但是当这个表只是建立这一个分区,当系统存入时间为“2021-10-02”这时就会抛出异常:Table has no partition for value ******
1.2.2 删除分区
删除一个分区(注意:删除一个分区时,该分区内的所有数据也都会被删除;)
alter table cb_ba_trade_detail_third drop partition p2,p3,p4
1.2.2.1
这里的p2,p3,p4指的就是分区的名称,逗号分割,可一次删除多个分区
1.2.3 查看分区内容
select partition_name part,partition_expression expr,FROM_UNIXTIME(partition_description) descr,table_rows from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='cb_ba_trade_detail_third'
一、oracle分区
1.1分区表结构
CREATE TABLE "CB_BA_TRADE_DETAIL_THIRD" (
"ID_" NUMBER ( 19, 0 ) NOT NULL ENABLE,
"ACCOUNTID_" NUMBER ( 19, 0 ),
"TRADETIME_" TIMESTAMP ( 6 ) NOT NULL ENABLE,
"HASPUSH_" NUMBER ( 1, 0 ),
CONSTRAINT "PK_CB_BA_TRADE_DETAIL_THIRD" PRIMARY KEY ( "ID_" ) USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
) PARTITION BY RANGE ( TRADETIME_ ) ( PARTITION p0 VALUES LESS THAN ( TIMESTAMP '2021-09-20 00:00:00') );
同mysql不太一样,在建表时,并不需要将分区字段增加为联合主键,但也是在建表后增加
PARTITION BY RANGE ( TRADETIME_ ) ( PARTITION p0 VALUES LESS THAN ( TIMESTAMP '2021-09-20 00:00:00') );
1.2、分区的增加,和删除,和查看分区信息
1.2.1 增加分区
alter table cb_ba_trade_detail_third add partition p1 values less than (TIMESTAMP '2021-10-01 00:00:00');
删除和查看分区内容的操作就不再赘述了,大致相同,时间原因,可自行查找资料