数据库分区,是数据库管理系统 提供的 一个 比较好的功能。当数据量大时,除了 分表,还可以对一个表进行分区。这样,就可以 再一个分区内 操作数据,提高性能。
常见的分区有 range、hash,一般情况下,range分区比较普遍。
注意的是,表分区,一定是在 创建表的时候 进行分区,后面才可以增加分区、删除分区。也就是说,分区操作的前提是 表 是一个 分区表。
比如:如果不是分区表,但是想增加分区时,会报错:
1505 - Partition management on a not partitioned table is not possible
这种情况,如果 必须创建分区的话,那只能新建一个 分区表,然后再 把原表数据中 同步到新表中。
创建分区表的时候,分区字段必须是:
1. 主键
2. 非空
创建非分区表:
CREATE TABLE `t_1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
创建分区表:
注意,在创建语句后面的 分号 ; 要去掉,不然 后面的分区语句就是单独的命令了。
CREATE TABLE `t_1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`,`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4PARTITION by range columns(`create_time`)
(
PARTITION p1 values less than ('2022-04-01 00:00:00'),
PARTITION p2 values less than ('2022-07-01 00:00:00'),
PARTITION p3 values less than ('2022-10-01 00:00:00'),
PARTITION p4 values less than ('2023-01-01 00:00:00'))
在分区表上 新增分区:
alter table t_1 add PARTITION
(
PARTITION p5 values less than ('2023-04-01 00:00:00'),
PARTITION p6 values less than ('2023-07-01 00:00:00'),
PARTITION p7 values less than ('2023-10-01 00:00:00'),
PARTITION p8 values less than ('2024-01-01 00:00:00'))
在分区表上 删除分区:
alter table t_1 drop partition p8;
分区维护 似乎比较麻烦,需要手动处理。可以设置定时任务 来完成 分区表的维护。
查询分区表 :
如果 没有加分区,则是全分区扫描:
可以在查询语句中加上分区号,则只在 指定 分区中 扫描
select * from t_1 partition(p1) where id=1