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

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

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

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

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;

        添加分区表

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)
);

        此时,会报错,含义如下

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

解决方案为:重建主键

--重建主键
alter table test DROP PRIMARY KEY, ADD PRIMARY key(id, created_time);

        再次执行分区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');

        最后,查询验证

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. MySQL创建用户时报

    2024-01-23 04:24:03       52 阅读
  2. gitlab创建某个时间分支

    2024-01-23 04:24:03       46 阅读
  3. 创建MySQL范围分区表详细指南

    2024-01-23 04:24:03       31 阅读
  4. mysql数据库自动生成默认时间不正确进行校正

    2024-01-23 04:24:03       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-23 04:24:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-23 04:24:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-23 04:24:03       82 阅读
  4. Python语言-面向对象

    2024-01-23 04:24:03       91 阅读

热门阅读

  1. MYSQL慢查询优化,提升速度

    2024-01-23 04:24:03       50 阅读
  2. 遍历数组的列

    2024-01-23 04:24:03       55 阅读
  3. etcd安装

    2024-01-23 04:24:03       52 阅读
  4. Vue3setup()的非语法糖和语法糖的用法

    2024-01-23 04:24:03       49 阅读
  5. Go语言实现跳动的爱心(附带源码)

    2024-01-23 04:24:03       58 阅读
  6. 面试 Vue 框架八股文十问十答第七期

    2024-01-23 04:24:03       56 阅读
  7. 如何调整服务器系统时间

    2024-01-23 04:24:03       53 阅读
  8. spring boot 常用的 Cron 表达式

    2024-01-23 04:24:03       56 阅读
  9. 决斗(线段树)

    2024-01-23 04:24:03       52 阅读
  10. Quarkus 2.8.0引入了细粒度的Transaction API

    2024-01-23 04:24:03       58 阅读