相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 41.1 mb
PDF (A4)- 41.2 mb
PDF (RPM)- 39.8 mb
HTML下载(TGZ)- 9.5 mb
HTML下载(Zip)- 9.6 mb
HTML下载(RPM)- 8.1 mb
手册(TGZ)- 260.5 kb
手册(Zip)- 371.7 kb
信息(Gzip)- 3.9 mb
信息(邮政编码)- 3.9 mb
本手册节选

24.2.1 RANGE分区

按范围分区的表的分区方式是,每个分区都包含分区表达式值位于给定范围内的行。类定义的范围应该是连续的但不重叠的小于操作符。对于接下来的几个例子,假设您正在创建一个如下所示的表来保存一个由20个音像店组成的连锁店的人员记录,编号从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 ' 99999-12-31 ', job_code INT NOT NULL, store_id INT NOT NULL);
请注意

员工此处使用的表没有主键或唯一键。虽然这些示例是为了实现本文的目的而使用的,但您应该记住,在实际操作中,表极有可能具有主键、惟一键或两者都有,并且分区列的允许选择取决于用于这些键的列(如果存在的话)。有关这些问题的讨论,请参见第24.6.1节“分区键、主键和唯一键”

根据您的需要,可以通过多种方式对这个表进行分区。一种方法是使用可以列。例如,您可能决定通过添加按范围划分条款如下:

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 ' 99999-12-31 ', job_code INT NOT NULL, store_id INT NOT NULL) PARTITION BY RANGE(分区p0值小于(6),分区p1值小于(11),分区p2值小于(16),分区p3值小于(21));

在这个分区方案中,与在商店1到5工作的员工对应的所有行都存储在分区中p0,存放于第6至10号店的员工p1,等等。每个分区按从低到高的顺序定义。这是一个要求按范围划分语法;你可以把它想象成类似于如果……elseif……在这方面,C或Java的语句。

很容易确定包含数据的新行(72年,“米歇尔”,“威尔逊”,“1998-06-25”,NULL, 13)插入到分区中p2但是当链上加21会怎样呢商店?在这个方案下,没有规则覆盖的行可以的值大于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 ' 99999-12-31 ', job_code INT NOT NULL, store_id INT NOT NULL) PARTITION BY RANGE(分区p0值小于(6),分区p1值小于(11),分区p2值小于(16),分区p3的值小于MAXVALUE);

(与本章中的其他例子一样,我们假设默认的存储引擎是InnoDB.)

请注意

在没有找到匹配值时避免错误的另一种方法是使用忽略关键字的一部分插入声明。示例请参见第24.2.2节,“LIST分区”.也看到第13.2.6节,“INSERT语句”,以获取有关的一般资料忽略

MAXVALUE表示一个整数值,它总是大于可能的最大整数值(在数学语言中,它用作最小上界).现在,任何行可以列值大于或等于16(定义的最大值)存储在分区中p3.在未来的某个时刻——当商店的数量增加到25、30或更多时,您可以使用ALTER TABLE语句为存储21-25、26-30等添加新分区(请参见第24.3节“分区管理”,以了解如何操作的详情)。

以几乎相同的方式,您可以基于雇员工作代码(即基于的范围)对表进行分区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 ' 99999-12-31 ', job_code INT NOT NULL, store_id INT NOT NULL) PARTITION BY RANGE (job_code)(分区p0值小于(100),分区p1值小于(1000),分区p2值小于(10000));

在此实例中,与店内工作人员相关的所有行都将存储在分区中p0的办公室及支援人员p1,以及与分区管理人员有关的文件p2

中也可以使用表达式小于条款。然而,MySQL必须能够计算表达式的返回值作为函数的一部分不到<)比较。

您可以使用基于两者之一的表达式,而不是根据存储号拆分表数据日期列。例如,假设您希望根据每个员工离开公司的年份进行分区;的价值(分离).一个关于创建表实现这样一个分区方案的语句如下所示:

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 ' 99999-12-31 ', job_code INT, store_id INT) PARTITION BY RANGE (YEAR(separated))(分区p0值小于(1991),分区p1值小于(1996),分区p2值小于(2001),分区p3值小于MAXVALUE);

在这个方案中,对于1991年以前离开的所有员工,行存储在分区中p0;对于那些在1991年到1995年离开的人,在p1;对于1996年到2000年离开的人,在p2;对于2000年以后离开的工人,在p3

也可以通过来划分表范围,基于a的值时间戳列,使用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('2008-01-01 00:00:00'))(分区p0值小于(UNIX_TIMESTAMP('2008-01-01 00:00:00')),分区p1值小于(UNIX_TIMESTAMP('2008-04-01 00:00:00')),分区p2值小于(UNIX_TIMESTAMP('2008-07-01 00:00:00')),分区p3值小于(UNIX_TIMESTAMP('2009-01-01 00:00:00')),分区p4值小于(UNIX_TIMESTAMP('2009-01-01 00:00:00')),分区p5值小于(UNIX_TIMESTAMP('2009-04-01 00:00:00')),分区p6值小于(UNIX_TIMESTAMP('2009-07-01 00:00:00')),分区p7值小于(UNIX_TIMESTAMP('2009-07-01 00:00:00')),分区p8值小于(UNIX_TIMESTAMP('2010-01-01 00:00:00')),分区p9值小于(MAXVALUE));

任何其他涉及时间戳值是不允许的。(参见Bug #42849。)

当满足以下一个或多个条件时,范围分区特别有用:

这种类型的分区的变体是范围列分区。分区的范围列允许使用多个列来定义分区范围,这些分区范围既适用于在分区中放置行,也适用于在执行分区修剪时确定包含或排除特定分区。看到第24.2.3.1节,“RANGE COLUMNS分区”,以查询更多资料。

基于时间间隔的分区方案。如果你想在MySQL 8.0中实现一个基于时间范围或间隔的分区方案,你有两个选择:

  1. 将表划分为范围,对于分区表达式,使用操作于的函数日期时间,或DATETIME列并返回一个整数值,如下所示:

    CREATE TABLE成员(名VARCHAR(25) NOT NULL,名VARCHAR(25) NOT NULL,用户名VARCHAR(16) NOT NULL,电子邮件VARCHAR(35), join DATE NOT NULL) PARTITION BY RANGE(YEAR(joined))(分区p0值小于(1960),分区p1值小于(1970),分区p2值小于(1980),分区p3值小于(1990),分区p4值小于MAXVALUE);

    在MySQL 8.0中,还可以根据分区表范围基于a的值时间戳列,使用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('2008-01-01 00:00:00'))(分区p0值小于(UNIX_TIMESTAMP('2008-01-01 00:00:00')),分区p1值小于(UNIX_TIMESTAMP('2008-04-01 00:00:00')),分区p2值小于(UNIX_TIMESTAMP('2008-07-01 00:00:00')),分区p3值小于(UNIX_TIMESTAMP('2009-01-01 00:00:00')),分区p4值小于(UNIX_TIMESTAMP('2009-01-01 00:00:00')),分区p5值小于(UNIX_TIMESTAMP('2009-04-01 00:00:00')),分区p6值小于(UNIX_TIMESTAMP('2009-07-01 00:00:00')),分区p7值小于(UNIX_TIMESTAMP('2009-07-01 00:00:00')),分区p8值小于(UNIX_TIMESTAMP('2010-01-01 00:00:00')),分区p9值小于(MAXVALUE));

    在MySQL 8.0中,涉及的任何其他表达式时间戳值是不允许的。(参见Bug #42849。)

    请注意

    在MySQL 8.0中也可以使用UNIX_TIMESTAMP (timestamp_column)作为分区表达式,用于分区由列表.然而,这样做通常是不实际的。

  2. 将表划分为范围列,使用日期DATETIME列作为分区列。例如,成员表可以使用加入列,如下所示:

    CREATE TABLE member (name 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)(分区p0值小于('1960-01-01'),分区p1值小于('1970-01-01'),分区p2值小于('1980-01-01'),分区p3值小于('1990-01-01'),分区p4值小于MAXVALUE);
请注意

使用日期或时间类型的分区列日期DATETIME不支持范围列