MySQL 基于创建时间进行RANGE分区

MySQL是一款广泛使用的关系型数据库。在MySQL中,大量数据场景提高查询效率是非常关键的,所以,对数据表进行分区是一个很好的选择。

在创建分区表之前,需要了解一下MySQL分区的基本概念。MySQL分区可以将一个大表分成多个小表,每个小表就是一个分区。常用的分区方式有:按范围分区RANGE、按列表分区LIST和按哈希分区HASH。而按照日期分区,是一种常用的按范围分区方式。

我们来看一下如何按日期创建分区表。首先,创建一个不分区的表

sql 复制代码
CREATE TABLE `test` (
  `id` bigint NOT NULL,
  `created_by` varchar(255) DEFAULT NULL,
  `created_time` datetime(6) DEFAULT NULL,
  `warehouse_code` varchar(255) DEFAULT NULL,
  `warehouse_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

添加分区表

sql 复制代码
ALTER TABLE test PARTITION BY RANGE COLUMNS(created_time) (
	PARTITION P202301 VALUES LESS THAN ('2024-01-01 00:00:00'),
	PARTITION P202401 VALUES LESS THAN ('2024-07-01 00:00:00'),
	PARTITION P202402 VALUES LESS THAN ('2025-01-01 00:00:00'),
	PARTITION P202501 VALUES LESS THAN ('2025-07-01 00:00:00'),
	PARTITION Pmax VALUES LESS THAN (MAXVALUE)
);

此时,会报错,含义如下

分区的字段必须是要包含在主键当中。这时候分区的字段要么是主键,要么把分区字段加入到主键中,从而形成复合主键。

解决方案为:重建主键

sql 复制代码
--重建主键
alter table test DROP PRIMARY KEY, ADD PRIMARY key(id, created_time);

再次执行分区sql,

并插入数据,查看分区表结构

sql 复制代码
INSERT INTO test
(id, created_by, created_time, warehouse_code, warehouse_name)
VALUES(1, 'aaa', now(), 'cccccc', 'ddddd');
INSERT INTO test
(id, created_by, created_time, warehouse_code, warehouse_name)
VALUES(1, 'aaa', '2023-08-15 01:11:16.328551', 'cccccc', 'ddddd');
INSERT INTO test
(id, created_by, created_time, warehouse_code, warehouse_name)
VALUES(1, 'aaa', '2023-05-15 01:11:16.328551', 'cccccc', 'ddddd');
INSERT INTO test
(id, created_by, created_time, warehouse_code, warehouse_name)
VALUES(1, 'aaa', '2024-07-11 01:11:16.328551', 'cccccc', 'ddddd');

最后,查询验证

sql 复制代码
EXPLAIN SELECT * FROM test as t WHERE created_time = '2024-07-11 01:11:16.328551'

至此,MySQL基于range分区完美结束

总结一下:

RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE分区的区别如下:

  1. RANGE COLUMNS不接受表达式,只能是列名。而RANGE分区则要求分区的对象是整数。

  2. RANGE COLUMNS允许多个列,在底层实现上,它比较的是多个列值组成的列表,而RANGE比较的是数值的大小。

  3. RANGE COLUMNS不限于整数对象,date,datetime,string都可作为分区列。

相关推荐
苍煜1 天前
SpringBoot单体应用到分布式下的数据库锁、事务、Redis事务、分布式锁、分布式事务协调
数据库·spring boot·分布式
xmjd msup1 天前
mysql的分区表
数据库·mysql
Lyyaoo.1 天前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM1 天前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens1 天前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.11 天前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
Rick19931 天前
mysql 慢查询怎么快速定位
android·数据库·mysql
科技小花1 天前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56611 天前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全1 天前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库