首页 > 数据库 >Mysql按照范围区间创建分区表

Mysql按照范围区间创建分区表

时间:2024-07-31 16:56:13浏览次数:15  
标签:00 01 创建 分区 PARTITION 分区表 Mysql NULL

定义

每一个分区仅包含在指定范围内的数据列。这样的分区方式就是范围分区。在Mysql的范围分区表定义中,分区范围需要连续并且不会有覆盖。定义范围分区表时,使用VALUES LESS THAN操作符。在PARTITION BY RANGE语法中,建立分区表指定分区时,每一个分区都是按顺序定义。使用时类似C语言和java中的if...elseif...表达式。

应用

本文的几个举例,都假设用户为一家具有20个门店的音响公司创建员工记录表。这20家门店的编号store_id是1到20.

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
);

使用store_id列进行分区

使用store_id列,将员工表建立四个分区

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
) partition by range (store_id) (
    partition p0 values less than (6),
    partition p1 values less than (11),
    partition p2 values less than (16),
    partition p3 values less than (21)
);

在这个新建的分区表中,门店1-5的员工数据,保存在第一个分区p0中;门店6-10的员工数据,保存在第二个分区p1中....

按照上面的分区表定义,Mysql很容易将数据(72, 'Mitchell', 'Wilson', '1998-06-25', DEFAULT, 7, 13) 插入第三个分区p2当中。但这家公司开了一家新的门店,第21个门店时,会出现什么样的问题。在这个分区表的定义中,并未指定门店编码超过20的处理方式,因此插入第21个门店的员工数据时,Mysql会报错。Mysql给出来一个数值MAXVALUE来解决这个问题。MAXVALUE是Mysql中最大的一个数值,所有数字都会比MAXVALUE小。则构建该分区表的语句变成下面的形式

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
) partition by range (store_id) (
    partition p0 values less than (6),
    partition p1 values less than (11),
    partition p2 values less than (16),
    partition p3 values less than MAXVALUE
);

现在,所有门店编号大于等于16的数据,都会插入到第四个分区p3当中。而当后续门店增加时,数据库管理员和开发人员,可以为表建立新的分区。如为编号21-25门店添加新的分区 ,为26-30的门店添加另一个分区 。

使用员工编号分区

使用员工编号分区的方式,是一种更加时髦的分区方法。在上面的例子中,数据库管理员和开发人员可以使用字段job_code进行分区。如,两位编码用于保存店长的信息。三位编码分配给办公室和后勤人员。而为销售经理分配四位编码。则可以按照下面的方法来创建分区表

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
) partition by range (job_code) (
    partition p0 values less than (100),
    partition p1 values less than (1000),
    partition p2 values less than (10000)
);

使用日期时间字段建立分区

除了使用门店编号,和员工代码分区外,还可以使用时间列来建立分区表。假设现在需要使用员工的离职年份建立分区。即使用YEAR(seperated)表达式返回的值来确定分区范围。则使用下面的语句建立分区表

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
) partition by range (YEAR(separated)) (
    partition p0 values less than (1991),
    partition p1 values less than (1996),
    partition p2 values less than (2001),
    partition p4 values less than MAXVALUE
);

在上面的分区表中,1991年前离职的员工在分区p0中,而在1991-1995年离职的员工,在分区p1中...

当然,也可以基于TIMESTAMP字段,按照时间范围来建立分区表,使用UNIX_TIMESTAMP()方法,建立分区表如下。

CREATE TABLE quarterly_report_status (
  report_id INT NOT NULL,
  report_status VARCHAR(20) NOT NULL,
  report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
  PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
  PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
  PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
  PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
  PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
  PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
  PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
  PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
  PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
  PARTITION p9 VALUES LESS THAN (MAXVALUE)
);

使用时间段分区使用下面的场景

  • 当开发人员或数据库管理员想要删除旧数据的时候,如前面的employee表,用户可以简单的使用ALTER TABLE employees DROP PARTITION p0,来删除1991年前离职员工的所有数据。当有很多数据需要删除时,使用这种删除方法比使用DELETE方法删除数据效率会高很多。
  • 用户想要使用时间或其他序列的字段来操作数据表
  • 用户经常使用表分区字段来进行查询。如当执行下面这条语句.Mysql能够快速的使用where查询条件找到第三个分区p2, 而不需要扫描其他分区的数据。
EXPLAIN SELECT COUNT(*) FROM employees WHERE seperated BETWEEN '2000-01-01' AND '2000-12-31' GROUP BY store_id

范围分区列

与范围分区相似的用法就是分区列。使用RANGE COLUMNS方法构建分区表,允许用户使用多个列来建立分区表。这些列可以共同用于查询时对扫描数据的修剪和过滤。

使用范围分区列来创建分区表。

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(joined) (
    PARTITION p0 VALUES LESS THAN ('1960-01-01'),
    PARTITION p1 VALUES LESS THAN ('1970-01-01'),
    PARTITION p2 VALUES LESS THAN ('1980-01-01'),
    PARTITION p3 VALUES LESS THAN ('1990-01-01'),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

标签:00,01,创建,分区,PARTITION,分区表,Mysql,NULL
From: https://blog.csdn.net/wilsonzane/article/details/140827377

相关文章

  • Oracle VM VirtualBox创建虚拟机相关问题
    这次直接使用virtualbox来进行虚拟机的创建和运行。在控制项里新建一台虚拟电脑,然后就是正常的选择虚拟镜像以及设置账户密码。我正常的就给虚拟机分配4G内存,处理器4CPU,然后磁盘空间分配个16G,当然后续都是可以进行调整的。之后就是系统的安装时间了,一段不算短的等待过后,终于出现......
  • MySQL基础20题(续前面的20题)
    写在前面今天继续前面的20题之后的练习,数据都是一样的,可以直接使用,来看看你的sql功底降了没。基础20题#1.查询每个员⼯的姓名、邮箱、职位名称以及所在部⻔名称。 SELECT CONCAT(last_name,first_name)as姓名, email, job_title, department_nameFROM employeese J......
  • mysql的sql怎么拼接字符串类型?
    在MySQL中,字符串拼接通常不使用+号,而是使用CONCAT()函数。MySQL并不支持用+号直接进行字符串接。在MySQL中,+号用于数值运算。使用CONCAT()函数进行字符串拼接示例:SELECTCONCAT('Hello','','World')ASgreeting;结果:+----------+|greeting|+---......
  • 完美使用 Google Cloud Run:为单个作业中的每个流程创建新的执行 ID
    我目前正在使用Prefect云来编排不同的任务,并且我正在使用CloudRunPush工作池将这些任务作为作业部署在GoogleCloudRun上。这是我面临的情况:每次运行流程时,它都会创建一个新的任务在CloudRun上工作。然而,这不是我想要的行为。相反,我希望每个部署都有一个作业,具有......
  • 在Vue3中创建动态主题切换功能
    随着现代Web开发的进步,用户体验变得愈发重要。在这方面,实现动态主题切换功能无疑是提高用户体验的有效方式。通过动态主题切换,用户可以根据自己的喜好选择明亮的主题或暗色主题,提供了更个性化、更舒适的使用体验。今天,我们将通过一个简洁的示例来展示,如何在Vue3中实现动态......
  • 如何在 python 中使用矩阵分解从 3 个不同的矩阵(2 个交互矩阵和 1 个相似矩阵)创建一个
    我有3个不同大小的矩阵A、B、C,它们有一些共同的元素。A(相似性)与B(交互)有一些共同元素,但与C(第二交互矩阵)没有共同元素。B有一些与C相同的元素。我想创建一个基于B和C的矩阵M,但提供基于A、B、C的输出,就像推荐系统类型一样,其中根据评分、观看次数和偏好推荐电影。例......
  • Go--创建以当前时间命名的excel文件
    下载依赖包goget-ugithub.com/xuri/excelize/v2 代码packagemainimport("fmt""github.com/xuri/excelize/v2""time")funcmain(){//获取当前时间now:=time.Now()filename:=fmt.Sprintf("%s.xlsx&......
  • 在 Python 中创建和/或检查编号变量的优雅方法
    我是一个试图学习Python的老家伙,所以我最后的编码经验是使用BASIC-不,不是VisualBasic。我理解一些与Python相关的概念,但我处于初级编码阶段,所以我使用“强力”逻辑编写了这个项目-基本上,将字符串分解为单个字母,然后用经典的“”测试每个字母猜单词类型的游戏。......
  • MySQL GTID详解
    MySQL在5.6版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事物是谁产生,产生多少事物,非常直接的标识出来。今天将讨论一下关于从库showslavestatus中的Retrieved_Gtid_Set和Executed_Gtid_Set.Retrieved_Gtid_Set:从库已经接收到主库的事务编号Executed......
  • pip安装mysqlclient报错
    pip安装mysqlclient报错报错信息Exception:Cannotfindvalidpkg-configname.SpecifyMYSQLCLIENT_CFLAGSandMYSQLCLIENT_LDFLAGSenvvarsmanually这个问题通常是由于缺少mysqlclient的开发包或者相关的环境变量导致的。要解决这个问题,你可以尝试以下几个步骤......