暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

23.2分区类型

原创 由迪 2020-11-17
979

本节讨论MySQL 8.0中可用的分区类型。这些包括此处列出的类型:

  • RANGE分区。 这种类型的分区根据列值在给定范围内将行分配给分区。请参见 第23.2.1节“ RANGE分区”。有关此类型扩展的信息RANGE COLUMNS,请参见第23.2.3.1节“ RANGE COLUMNS分区”
  • 列表分区。 类似于通过进行分区RANGE,不同之处在于,根据匹配一组离散值之一的列选择分区。请参见 第23.2.2节“列表分区”。有关此类型扩展的信息LIST COLUMNS,请参见第23.2.3.2节“列表列分区”
  • HASH分区。 使用这种类型的分区,将根据用户定义的表达式返回的值来选择一个分区,该表达式将对要插入表中的行中的列值进行操作。该函数可以包含在MySQL中有效的任何产生非负整数值的表达式。LINEAR HASH也可以扩展此类型。请参见第23.2.4节“ HASH分区”
  • 密钥分区。 这种类型的分区类似于通过进行分区 HASH,不同之处在于,仅提供一个或多个要评估的列,并且MySQL服务器提供了自己的哈希函数。这些列可以包含非整数值,因为MySQL提供的哈希函数可以保证整数结果,而与列数据类型无关。LINEAR KEY也可以扩展此类型 。请参见 第23.2.5节“密钥分区”

数据库分区的一种非常常见的用法是按日期隔离数据。某些数据库系统支持显式日期分区,而MySQL在8.0中未实现。但是,不能在MySQL中很难创建基于分区方案 DATETIMEDATETIME列,或基于表达式利用这样的列。

当通过划分KEYLINEAR KEY,可以使用一个DATETIMEDATETIME列作为分区列不进行列值的任何修饰。例如,此表创建语句在MySQL中完全有效:

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 KEY(joined) PARTITIONS 6;

在MySQL 8.0,但也可以使用一个 DATEDATETIME列作为使用分区列RANGE COLUMNSLIST COLUMNS分区。

其他分区类型需要一个产生整数值或的分区表达式NULL。如果您希望使用基于日期的分区RANGELISTHASH,或者 LINEAR HASH,你可以简单地使用,其操作上的功能DATETIMEDATETIME列,并返回这样的值,如下所示:

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( YEAR(joined) ) ( PARTITION p0 VALUES LESS THAN (1960), PARTITION p1 VALUES LESS THAN (1970), PARTITION p2 VALUES LESS THAN (1980), PARTITION p3 VALUES LESS THAN (1990), PARTITION p4 VALUES LESS THAN MAXVALUE );

在本章的以下各节中,可以找到使用日期进行分区的其他示例:

有关基于日期的分区的更复杂的示例,请参见以下部分:

MySQL的分区是采用最优化 TO_DAYS()YEAR()TO_SECONDS()功能。但是,您可以使用其他日期和时间函数返回一个整数或者NULL,例如 WEEKDAY()DAYOFYEAR()MONTH()。有关此类功能的更多信息请参见 第12.7节“日期和时间功能”

重要的是要记住,无论使用哪种分区,分区总是在创建时自动按顺序编号,并以开头 0。当在分区表中插入新行时,正是这些分区号用于标识正确的分区。例如,如果你的表使用4个分区,这些分区编号012,和 3。对于RANGELIST分区类型,有必要确保为每个分区号定义一个分区。对于HASH分区,用户提供的表达式的求值必须大于的整数值0。对于KEY 分区时,MySQL服务器内部使用的哈希函数会自动解决此问题。

分区名称通常遵循管理其他MySQL标识符的规则,例如表和数据库的标识符。但是,您应该注意分区名称不区分大小写。例如,以下 CREATE TABLE语句失败,如下所示:

mysql> CREATE TABLE t2 (val INT) -> PARTITION BY LIST(val)( -> PARTITION mypart VALUES IN (1,3,5), -> PARTITION MyPart VALUES IN (2,4,6) -> ); ERROR 1488 (HY000): Duplicate partition name mypart

发生故障是因为MySQL认为分区名称mypart和 之间没有区别MyPart

当您指定表的分区数时,该值必须表示为无前导零的正非零整数文字,并且即使是计算结果为整数值,也可能不是诸如0.8E+01或的表达式 6-2。不允许小数部分。

在以下各节中,我们不一定提供可用于创建每种分区类型的语法的所有可能形式;有关此信息,请参见 第13.1.20节“ CREATE TABLE语句”

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论