Skip to content

MySQL分区表

xinwu-yang edited this page Feb 28, 2023 · 1 revision

建表时分区

CREATE TABLE article_range (
    id INT auto_increment,
    title VARCHAR (64),
    content text,
    created_time DATETIME,
    PRIMARY KEY (id, created_time) -- 要求分区依据字段必须是主键的一部分
) charset = utf8 PARTITION BY RANGE COLUMNS(created_time) (
    -- 注意:分区的定义顺序依照created_time范围从小到大,不能颠倒
    PARTITION p20190101
    VALUES
        LESS THAN ('2019-01-31'),
        PARTITION p20190201
    VALUES
        LESS THAN ('2019-02-28'),
        PARTITION p20190301
    VALUES
        LESS THAN ('2019-03-31'),
        PARTITION pm -- 默认分区,最新数据往这里面存储
    VALUES
        LESS THAN (MAXVALUE)
);

分区结果:

动态添加表分区

增加分区需要用到 REORGANIZE 命令,它的作用是对某个分区重新分配。 比如明天是4月1号,那我们要给4月1号也增加个分区,实际上就是把 pm 分区拆分成2个分区。

ALTER TABLE
    article_range REORGANIZE PARTITION pm INTO (
        PARTITION p20190401
        VALUES
            LESS THAN ('2019-04-30'),
            PARTITION pm
        VALUES
            LESS THAN (MAXVALUE)
    );

分区结果:

已存在表分区

ALTER TABLE
    article_range PARTITION BY RANGE COLUMNS (created_time) (
        PARTITION p20190101
        VALUES
            LESS THAN ('2019-01-31'),
            PARTITION p20190201
        VALUES
            LESS THAN ('2019-02-28'),
            PARTITION p20190301
        VALUES
            LESS THAN ('2019-03-31'),
            PARTITION pm
        VALUES
            LESS THAN (MAXVALUE)
    );

移除分区

ALTER TABLE article_range REMOVE PARTITIONING; --移出表article_range所有分区,但不删除数据
ALTER TABLE article_range DROP PARTITION [分区名称]; --删除指定分区,分区中原有的数据也会随之删除!

验证

-- 插入测试数据
INSERT INTO `cube`.`article_range`(`title`, `content`, `created_time`) VALUES ('1', '1', '2019-01-01 15:10:33');
INSERT INTO `cube`.`article_range`(`title`, `content`, `created_time`) VALUES ('2', '2', '2020-02-01 00:00:00');

-- 查询分析 查询2019年1-3月的数据
EXPLAIN SELECT * FROM article_range WHERE created_time BETWEEN '2019-01-01 00:00:00' AND '2019-03-01 00:00:00';
-- 命中三个分区

最佳实践

建议是预先规划的方案,按照分区策略提前规划好5-10年的分区规模。如:按照时间每月分区,可提前建好10年的月份的表分区。

更新日志

CHANGELOG

开发环境

开发环境安装

Git开发和迭代规范

Git开发和迭代规范

快速开始

3.0.x

2.6.x

代码生成器

如何使用代码生成器

自定义代码生成器模板

开发技巧

登录和凭证配置介绍

如何在代码中获取当前登录对象

字典翻译

菜单路由配置

数据日志如何使用

查询过滤器用法

系统操作日志怎么插入

平台消息推送接口

限制API重复提交

部门父子编码使用方法

系统文件上传

系统编码规则如何使用

系统校验规则如何使用

第三方平台如何调用魔方API

如何切换回Druid数据源

自定义接口拦截器

自定义接口参数Formatter

使用SpringDoc编写API文档

系统权限用法

接口请求权限

页面按钮权限

表格列字段权限

二级部门权限管理

数据权限

表单权限

业务模块

Quartz任务调度

消息中心

第三方登录

阿里云OSS(MinIO)上传管理模块

魔方Plugins

工作流引擎

SQL导出

字符串脱敏

Excel的快速导入导出

文件的上传和下载

加密插件

接入magic-api

新版代码生成器

通用地图服务

高级用法

部门结构变化权限如何控制

如何优雅的拓展用户部门字段

多租户

SSO单点登录

Prometheus

数据库专栏

MySQL5.7+

MySQL分区表

达梦数据库(DM8)

魔方集成达梦数据库

从MySQL迁移到达梦数据库

达梦8与MySQL的主要区别

MyCat分库分表

原则

垂直分片Demo

水平分片Demo

微服务

如何切换微服务

微服务组件

预研Demo示例

预研Demo示例

Clone this wiki locally