MySQL分区表(二)

news2024/11/5 12:27:45

说明:之前有写过一篇博客,介绍MySQL如何建立分区表,本文介绍如何建立子分区表。子分区,就是在原来分区的基础上,再嵌套一个分区。

例如,按照记录的创建时间分区,在此基础上,再按照租户ID嵌套一个子分区。如果按照时间建立了12个分区,租户ID有3个,那么最终建立的子分区就是:12 × 3 = 36个;

下面介绍如何建立和使用子分区:

建立

如下,建立一个子分区表,tb_user;

-- 建立子分区表tb_user
CREATE TABLE `tb_user`
(
    `id`          int         NOT NULL AUTO_INCREMENT,
    `tenant_id`   varchar(50) NOT NULL,
    `username`    varchar(20) DEFAULT NULL,
    `password`    varchar(20) DEFAULT NULL,
    `create_date` bigint      NOT NULL,
    PRIMARY KEY (`id`, `tenant_id`, `create_date`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_general_ci
    COMMENT ='用户表'
    PARTITION BY RANGE (`create_date`) SUBPARTITION BY key (`tenant_id`)
        (
        PARTITION tb_user_1735660800000 VALUES LESS THAN (1735660800000)
            (
            SUBPARTITION tb_user_1735660800000_01,
            SUBPARTITION tb_user_1735660800000_02
            ),
        PARTITION tb_user_1767196800000 VALUES LESS THAN (1767196800000)
            (
            SUBPARTITION tb_user_1767196800000_01,
            SUBPARTITION tb_user_1767196800000_02
            )
        );

PARTITION BY后面部分是分区相关的SQL,表示按照create_date字段range分区,后根据tenant_id字段key分区,以上是建表时就定义好的。

如果是针对一张已存在的表建立子分区,就用下面这个,当然,建立分区的字段需要是主键,如果不是,需要先修改表结构

-- 对tb_table建立子分区
ALTER TABLE tb_user PARTITION BY RANGE (`create_date`) SUBPARTITION BY key (`tenant_id`)
    (
    -- 2025-01-01 00:00:00
    PARTITION tb_user_1735660800000 VALUES LESS THAN (1735660800000)
        (
        SUBPARTITION tb_user_1735660800000_01,
        SUBPARTITION tb_user_1735660800000_02
        ),
    -- 2026-01-01 00:00:00
    PARTITION tb_user_1767196800000 VALUES LESS THAN (1767196800000)
        (
        SUBPARTITION tb_user_1767196800000_01,
        SUBPARTITION tb_user_1767196800000_02
        )
    );

执行后,可以看到这张表的分区,是有两层级的。

在这里插入图片描述

使用

下面插入四条数据,如下:

-- 插入数据
-- 1706803200000:2024-02-02 00:00:00
-- 1706803200000:2025-02-02 00:00:00
insert into `tb_user` (tenant_id, username, password, create_date)
values ('1', '分区1', '123456', 1706803200000),
       ('2', '分区2', '12345', 1738425600000),
       ('2', '分区3', '1234', 1706803200000),
       ('1', '分区4', '123', 1738425600000);

然后敲下面的SQL,查看各个分区的情况:

-- 查看各个分区数据
select
    PARTITION_NAME,
    SUBPARTITION_NAME,
    partition_ordinal_position,
    partition_method,
    partition_expression,
    partition_description,
    table_name,
    table_rows
from information_schema.partitions
where table_name = 'tb_user';

可以看到,每个子分区里各存了一条记录,说明分区建立成功了。

在这里插入图片描述

另外

子分区,需要注意以下两点:

(1)对现有表建立分区,历史数据不会被整理到指定分区里,只有修改了历史记录的分区字段,才会被分配到指定分区里;

(2)当数据从一个分区修改到另一个分区时,会落入到子分区值相同的那个分区;


第1点,如下,先插入数据,再分区,查看分区情况,

-- 1.创建表
CREATE TABLE `tb_user`
(
    `id`          int         NOT NULL AUTO_INCREMENT,
    `tenant_id`   varchar(50) NOT NULL,
    `username`    varchar(20) DEFAULT NULL,
    `password`    varchar(20) DEFAULT NULL,
    `create_date` bigint      NOT NULL,
    PRIMARY KEY (`id`, `tenant_id`, `create_date`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_general_ci COMMENT ='用户表';

-- 2.插入数据
-- 1706803200000:2024-02-02 00:00:00
-- 1738425600000:2025-02-02 00:00:00
insert into `tb_user` (tenant_id, username, password, create_date)
values ('1', '分区1', '123456', 1706803200000),
       ('2', '分区2', '12345', 1738425600000),
       ('2', '分区3', '1234', 1706803200000),
       ('1', '分区4', '123', 1738425600000);

-- 3.分区
alter table tb_user PARTITION BY RANGE (`create_date`) SUBPARTITION BY key (`tenant_id`)
    (
    PARTITION tb_user_1735660800000 VALUES LESS THAN (1735660800000)
        (
        SUBPARTITION tb_user_1735660800000_01,
        SUBPARTITION tb_user_1735660800000_02
        ),
    PARTITION tb_user_1767196800000 VALUES LESS THAN (1767196800000)
        (
        SUBPARTITION tb_user_1767196800000_01,
        SUBPARTITION tb_user_1767196800000_02
        )
    );

-- 4.查看各个分区数据
select PARTITION_NAME,
       SUBPARTITION_NAME,
       partition_ordinal_position,
       partition_method,
       partition_expression,
       partition_description,
       table_name,
       table_rows
from information_schema.partitions
where table_name = 'tb_user';

数据没有落入到分区里;

在这里插入图片描述

在这里插入图片描述

如果修改历史数据的分区字段,如下:

-- 5.修改数据
UPDATE tb_user
SET tenant_id = '2'
WHERE id = 1;

在这里插入图片描述

数据分配到了指定分区里;

在这里插入图片描述


第2点,如上,create_date是一级分区字段,tenant_id是二级分区字段,当某条记录修改了create_date,从一个分区换到了另一个分区,数据会落入到这个分区里tenant_id相同值的那个子分区。(感觉是废话,这是当然的)

总结

本文介绍了如何在MySQL中建立子分区,关于MySQL建立List、Range分区,参考下面这篇文章:

  • MySQL分区表(一)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2231303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm043基于JavaEE的龙腾公司员工信息管理系统的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:龙腾公司员工信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本龙腾公司…

使用 PyCharm 构建 FastAPI 项目:零基础入门 Web API 开发

使用 PyCharm 构建 FastAPI 项目:零基础入门 Web API 开发 本文提供了一份完整的 FastAPI 入门指南,涵盖从环境搭建、依赖安装到创建并运行一个简单的 FastAPI 应用的各个步骤。通过 FastAPI 和 Uvicorn,开发者可以快速构建现代化的 Web API…

<项目代码>YOLOv8 夜间车辆识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

centos7.X zabbix监控参数以及邮件报警和钉钉报警

1:zabbix安装 1.1 zabbix 环境要求 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低) 操作系统: Linux centos7.2 x86_64 Python 2.7.x Mariadb Server ≥ 5.5.56 httpd-2.4.6-93.el7.centos.x86_64 PHP 5.4.161.2 zabbix安装版本 [rootnod…

类(4)

1.拷贝构造函数 我们在创建对象得的时候,可否创造一个与已存在对象一摸一样的对象呢? 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) 用在已存在的类类型对象创建新对象时…

‌【元素周期表】氢

化学式:H₂ 外观:无色透明 分子量:2.01588 吸入少量氢气对人体没有危害,甚至还可能对人体有益。但是不能吸入大量氢气,否则可能会对身体造成影响。 氢在生活中的主要用途包括以下几个方面‌: ‌医疗保健…

【06】A-Maven项目SVN设置忽略文件

做Web项目开发时,运用的是Maven管理工具对项目进行管理,在项目构建的过程中自动生成了很多不需要SVN进行管理的文件,SVN在对源码进行版本管理时,需要将其忽略,本文给出了具体解决方案。 SVN设置忽略Maven项目中自动生成…

【Windows】X-DOC:无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台

【Windows】X-DOC:无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台 1、前言2、Jellyfin服务搭建2.1 Jellyfin简介2.2 Jellyfin下载2.3 Jellyfin安装2.4 Jellyfin设置2.5 Jellyfin使用 3、终端访问3.1 浏览器访问 4、内网穿透 1、前言 下载收藏高清电影、电视…

海的记忆篇章:海滨学院班级回忆录项目

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足,创建了一个计算机管理海滨学院班级回忆录的方案。文章介绍了海滨学院班级回…

Unity 使用Netcode实现用户登录和登出

Unity之NetCode for GameObjets 基本使用 说明思路相关API代码实现Tips 说明 最近项目需要联机,项目方案选用Unity提供的NetCode for GameObjets(以下简称NGO),踩了不少坑,本文不介绍基础使用,围绕双端&…

C++(类和对象-运算符重载)

运算符重载概念: 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 运算符重载的同时也可以发生函数重载 1.加号运算符重载 1.1加号运算符重载的本质 1.2运算符重载也可以发生函数重载 总结1:对于内置的数据类型…

Flink CDC 同步 Mysql 数据

文章目录 一、Flink CDC、Flink、CDC各有啥关系1.1 概述1.2 和 jdbc Connectors 对比 二、使用2.1 Mysql 打开 bin-log 功能2.2 在 Mysql 中建库建表准备2.3 遇到的坑2.4 测试 三、番外 一、Flink CDC、Flink、CDC各有啥关系 Flink:流式计算框架,不包含 …

Sigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导

SSigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导 Sigrity Power SI的VR noise Metrics check模式本质上是用来评估和观测器件的电源网络的耦合对于信号的影响,输出S参数以及列出具体的贡献值。 以下图为例

Vue computed watch

computed watch watch current prev

恋爱脑学Rust之智能指针Rc,RefCell和Weak指针

小明和小丽为了维系彼此的关系,一起探索了智能指针的奥秘。通过 Rc、RefCell 和 Weak 的帮助,他们得以克服情感中遇到的种种困境。 第一章:Rc 智能指针的共生 小明和小丽搬进了一个共同的小屋,他们彼此相爱,决定共用…

Matlab车牌识别课程设计报告(附源代码)

Matlab车牌识别系统 分院(系) 信息科学与工程 专业 学生姓名 学号 设计题目 车牌识别系统设计 内容及要求: 车牌定位系统的目的在于正确获取整个图像中车牌的区域, 并识别出车牌号。通过设计实现车牌识别系…

Java 文件操作与IO流

文件 文件有两个概念,在广义来看就是操作系统上对硬件和软件资源抽象为文件。 在侠义上来看,就是我们保存在硬盘上的文件 在这里我们讨论的是狭义的文件,在外面的硬盘上的文件细分又可以分为二进制文件和文本文件,文本文件可以通…

C++ 优先算法 —— 有效三角形的个数(双指针)

目录 题目:有效三角形个数 1. 题目解析 2. 算法原理 解法一: 暴力枚举 解法二: 双指针算法 3. 代码实现 暴力枚举 双指针算法 题目:有效三角形个数 1. 题目解析 题目截图: 题目的意思就是在一个数组中&#x…

前端拖拽库方案之react-beautiful-dnd

近期,知名 React 拖拽库 react-beautiful-dnd 宣布了项目弃用的决定,未来将不再维护。这一决定源于其存在的缺陷与局限性,促使作者转向开发一个更加现代化的拖拽解决方案——Pragmatic drag and drop(下面会介绍)&…

《高频电子线路》—— 调制

文章内容来源于【中国大学MOOC 华中科技大学通信(高频)电子线路精品公开课】,此篇文章仅作为笔记分享。 调制 调制的原因 第一个原因 是为了要做出切实可行的天线。 无线电波能够从天线发射出去,以及正常的接收,需要…