相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 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
本手册节选

MySQL 8.0参考手册/.../ RANGE和LIST分区的管理

24.3.1 RANGE和LIST分区管理

范围分区和列表分区的添加和删除以类似的方式处理,因此我们将在本节中讨论这两种分区的管理。有关使用按哈希或键分区的表的信息,请参见第24.3.2节,“HASH和KEY分区的管理”

从其中一个分区的表中删除分区范围或通过列表可以使用ALTER TABLE声明。删除分区选择。假设您已经创建了一个按范围划分的表,然后使用以下方法填充了10条记录创建表而且插入声明:

mysql> CREATE TABLE tr (id INT,名称VARCHAR(50),购买日期)-> PARTITION BY RANGE(年(购买))(-> PARTITION p0 VALUES LESS THAN (1990), -> PARTITION p1 VALUES LESS THAN (1995), -> PARTITION p2 VALUES LESS THAN (2000), -> PARTITION p3 VALUES LESS THAN (2005), -> PARTITION p4 VALUES LESS THAN (2010), -> PARTITION p5 VALUES LESS THAN (2015) ->);查询好,0行影响(0.28秒)mysql >插入tr值- >(1台组织者的' 2003-10-15 '),- - - - - - >(2,“闹钟”,“1997-11-05”),- - - - - - >(3,“椅子”,“2009-03-10”),- - - - - - >(4,“书架”,“1989-01-10”),- - - - - - >(5“健身自行车”,“2014-05-09”),- - - - - - >(6,“沙发”,“1987-06-05”),- - - - - - >(7,“咖啡机”,“2011-11-22”),- - - - - - >(8,“水族馆”,“1992-08-04”),- - - - - - >(9日学习的桌子,“2006-09-16”),- - - - - - >(10,熔岩灯,' 1998-12-25 ');查询OK, 10行影响(0.05秒)记录:10重复:0警告:0

您可以看到哪些项应该被插入到分区中p2如下图:

mysql> SELECT * FROM > WHERE WHERE bought BETWEEN 1995-01-01 AND 1999-12-31;+------+-------------+------------+ | id |名称|购买  | +------+-------------+------------+ | 闹钟2 | | 1997-11-05 | | 10 |熔岩灯| 1998-12-25  | +------+-------------+------------+ 2行集(0.00秒)

你也可以使用分区选择来获取这些信息,如下所示:

mysql> SELECT * FROM tr PARTITION (p2)+------+-------------+------------+ | id |名称|购买  | +------+-------------+------------+ | 闹钟2 | | 1997-11-05 | | 10 |熔岩灯| 1998-12-25  | +------+-------------+------------+ 2行集(0.00秒)

看到第24.5节“分区选择”,以获取更多资料。

删除指定的分区p2,执行以下命令:

mysql>删除分区查询OK, 0行受影响(0.03秒)
请注意

NDBCLUSTER存储引擎不支持修改表…删除分区.但是,它支持其他与分区相关的扩展ALTER TABLE我们将在本章中描述。

记住这一点很重要,删除分区时,也会删除该分区中存储的所有数据.您可以通过重新运行前面的代码看到这种情况选择查询:

mysql> SELECT * FROM tr WHERE WHERE created -> BETWEEN '1995-01-01' AND '1999-12-31';空集(0.00秒)
请注意

删除分区本地分区就地api支持,并可与算法={复制|原地}删除分区算法=原地删除分区中存储的数据,并删除该分区。然而,删除分区算法=复制old_alter_table =对重新构建分区表,并尝试将数据从删除的分区移动到具有兼容分区的另一个分区分区…值定义。删除无法移动到其他分区的数据。

正因为如此,你必须拥有下降在执行之前为表设置特权修改表…删除分区在那张桌子上。

如果希望删除所有分区中的所有数据,同时保留表定义及其分区方案,请使用截断表声明。(见第13.1.37节“TRUNCATE TABLE语句”.)

如果要更改表的分区没有丢失数据,使用修改表…重组分区代替。见下文或第13.1.9节“ALTER TABLE语句”,浏览有关重组分区

如果现在执行显示创建表语句中,你可以看到表的分区组成是如何被改变的:

mysql >显示创建表tr \ G  *************************** 1。列***************************表:tr创建表:Create表' tr ' (' id ' int(11) DEFAULT NULL, ' name ' varchar(50) DEFAULT NULL, ' purchased ' date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!(分区p0值小于(1990)引擎= InnoDB,分区p1值小于(1995)引擎= InnoDB,分区p3值小于(2005)引擎= InnoDB,分区p4值小于(2010)引擎= InnoDB,分区p5值小于(2015)引擎= InnoDB) */ 1 row in set (0.00 sec)

将新行插入已更改的表时购买之间的列值“1995-01-01”而且“2004-12-31”包括在内,这些行存储在分区中p3.您可以通过以下方式验证这一点:

mysql> INSERT INTO tr VALUES(11, '铅笔夹','1995-07-12');mysql> SELECT * FROM tr WHERE purchased -> BETWEEN '1995-01-01' AND '2004-12-31';+------+----------------+------------+ | id |名称|购买  | +------+----------------+------------+ | 1 |桌子组织者| 2003-10-15 | | 11 |铅笔持有人| 1995-07-12  | +------+----------------+------------+ 2行集(0.00秒)mysql > ALTER TABLE tr分区p3下降;mysql> SELECT * FROM WHERE purchased -> BETWEEN '1995-01-01' AND '2004-12-31';空集(0.00秒)

从表中删除的行数修改表…删除分区不是由服务器报告,因为它将由等效删除查询

下降列表分区使用完全相同修改表…删除分区用于删除的语法范围分区。但是,这对以后使用表的影响有一个重要的区别:您不能再将包含定义已删除分区的值列表中的值的任何行插入到表中。(见第24.2.2节,“LIST分区”,例如。)

要将新的范围或列表分区添加到先前分区的表中,请使用修改表…添加分区声明。对于由范围,这可以用于在现有分区列表的末尾添加一个新范围。假设您有一个分区表,其中包含组织的成员数据,定义如下:

CREATE TABLE member (id INT, fname VARCHAR(25), lname VARCHAR(25), dob DATE) PARTITION BY RANGE(年份(dob))(分区p0值小于(1980),分区p1值小于(1990),分区p2值小于(2000));

进一步假设会员的最低年龄是16岁。随着日历临近2015年年底,你意识到你必须尽快准备接纳2000年(及以后)出生的成员。您可以修改成员适用于2000年至2010年出生的新成员的表格如下:

增加分区(分区p3值小于(2010))

对于按范围分区的表,可以使用添加分区仅将新分区添加到分区列表的高端。试图以这种方式在现有分区之间或之前添加新分区会导致如下所示的错误:

mysql> ALTER TABLE members > ADD PARTITION (> PARTITION n VALUES小于(1970))错误1463 (HY000): VALUES小于值必须严格»增加每个分区

你可以通过将第一个分区重新组织成两个新的分区来解决这个问题,就像这样:

ALTER TABLE成员将分区p0重组为(分区n0值小于(1970),分区n1值小于(1980));

使用显示创建表你可以看到ALTER TABLE声明已达到预期效果:

mysql >显示创建表成员\ G  *************************** 1。Create Table: Create Table ' members ' (' id ' int(11) DEFAULT NULL, ' fname ' varchar(25) DEFAULT NULL, ' lname ' varchar(25) DEFAULT NULL, ' dob ' date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(dob))(分区n0值小于(1970)引擎= InnoDB,分区n1值小于(1980)引擎= InnoDB,分区p1值小于(1990)引擎= InnoDB,分区p2值小于(2000)引擎= InnoDB,分区p3值小于(2010)引擎= InnoDB) */ 1 row in set (0.00 sec)

另请参阅章节13.1.9.1,“ALTER TABLE分区操作”

你也可以使用修改表…添加分区向分区的表添加新分区列表.假设有一张桌子tt使用下面的定义创建表声明:

CREATE TABLE tt (id INT, data INT) PARTITION BY LIST(data) (PARTITION p0 VALUES IN (5,10,15), PARTITION p1 VALUES IN (6,12,18));

属性的行可以添加一个新分区,在其中存储数据列值714,21如图所示:

修改表p2的值(7,14,21)

记住,你不能添加一个新的列表包含现有分区的值列表中已经包含的任何值的分区。如果你尝试这样做,会导致一个错误:

mysql> ALTER TABLE tt ADD PARTITION > (PARTITION np VALUES IN (4,8,12));错误1465 (HY000):同一个常量在列表分区中有多个定义

因为任何带有数据列值12已经分配给分区了吗p1,不能在表上创建新分区tt包括12在其值列表中。要做到这一点,您可以放弃p1,并添加np然后是newp1经过修改的定义。但是,如前所述,这将导致丢失存储在中的所有数据p1而且通常情况下,这并不是你真正想做的。另一种解决方案似乎是使用新的分区创建表的副本,并使用将数据复制到其中创建表…选择……,然后删除旧表并重命名新表,但在处理大量数据时,这可能非常耗时。这在需要高可用性的情况下可能也不可行。

您可以在一个分区中添加多个分区修改表…添加分区如下所示:

CREATE TABLE employees (id INT NOT NULL, fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL,雇用日期NOT NULL)分区范围(年(雇用))(分区p1值小于(1991),分区p2值小于(1996),分区p3值小于(2001),分区p4值小于(2005));修改表雇员:增加分区(分区p5值小于(2010),分区p6值小于(MAXVALUE));

幸运的是,MySQL的分区实现提供了在不丢失数据的情况下重新定义分区的方法。让我们先看几个简单的例子范围分区。回忆起成员表,现在定义如下:

mysql >显示创建表成员\ G  *************************** 1。Create Table: Create Table ' members ' (' id ' int(11) DEFAULT NULL, ' fname ' varchar(25) DEFAULT NULL, ' lname ' varchar(25) DEFAULT NULL, ' dob ' date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(dob))(分区n0值小于(1970)引擎= InnoDB,分区n1值小于(1980)引擎= InnoDB,分区p1值小于(1990)引擎= InnoDB,分区p2值小于(2000)引擎= InnoDB,分区p3值小于(2010)引擎= InnoDB) */ 1 row in set (0.00 sec)

假设您希望将表示1960年之前出生的成员的所有行移动到一个单独的分区中。正如我们已经看到的,这不能用修改表…添加分区.但是,您可以使用另一个与分区相关的扩展来ALTER TABLE要做到这一点:

ALTER TABLE成员将分区n0重组为:分区s0值小于(1960),分区s1值小于(1970);

实际上,这个命令分割分区p0进入两个新的分区s0而且s1.它还移动存储在的数据p0进入新的分区,根据规则体现在两个分区…值……条款,这样s0仅包含用于(捐赠)小于1960年和s1包含的那些行(捐赠)大于或等于1960但小于1970。

一个重组分区子句也可以用于合并相邻的分区。属性上的前面语句的效果可以颠倒成员如下表所示:

将s0,s1分区重新组织成(分区p0值小于(1970));

使用分隔或合并分区时不会丢失数据重组分区.在执行上述语句时,MySQL将移动存储在分区中的所有记录s0而且s1进入分区p0

的通用语法重组分区如图所示:

ALTER TABLEtbl_name重组分区partition_list到(partition_definitions);

在这里,tbl_name分区表的名称,和partition_list要更改的一个或多个现有分区的名称的逗号分隔列表。partition_definitions是一个以逗号分隔的新分区定义列表,其遵循与partition_definitions使用的列表创建表.使用时,您不局限于将几个分区合并为一个分区,或将一个分区分割为多个分区重组分区.的所有四个分区都可以重新组织成员表分成两部分,像这样:

将分区p0,p1,p2,p3重新组织成(分区m0值小于(1980),分区m1值小于(2000));

你也可以使用重组分区使用分区的表列表.让我们回到向list-partitioned中添加新分区的问题tt表失败,因为新分区的值已经存在于一个现有分区的值列表中。我们可以通过添加一个只包含不冲突值的分区来处理这个问题,然后重新组织新分区和现有分区,以便存储在现有分区中的值现在被移动到新的分区中:

ALTER TABLE tt ADD PARTITION (PARTITION np VALUES IN (4,8));ALTER TABLE tt REORGANIZE PARTITION p1,np INTO (PARTITION p1 VALUES IN (6,18), PARTITION np VALUES IN (4,8,12));

下面是使用时要记住的一些要点修改表…重组分区对被分区的表重新分区范围列表

  • 分区用于确定新分区方案的选项遵循与用于分区方案的选项相同的规则创建表声明。

    一个新的范围分区方案不能有任何重叠范围;一个新的列表分区方案不能有任何重叠的值集。

  • 中的分区组合partition_definitions列表中所指定的组合分区在整体上应占相同的范围或值集partition_list

    例如,分区p1而且p2一起涵盖了1980年到1999年的成员表以本节为例。这两个分区的任何重组都应涵盖相同的总体年份范围。

  • 对于按范围,只能重组相邻分区;不能跳过范围分区。

    例如,您无法重新组织示例成员表中使用以将分区p0,p2重新组织成…因为p0涵盖1970年之前的年份和p2包括1990年到1999年,所以这些不是相邻的分区。(不能跳过分区p1在这种情况下。)

  • 你不能使用重组分区要更改表使用的分区类型(例如,不能更改范围分区哈希分区或相反)。也不能使用此语句更改分区表达式或列。要在不删除和重新创建表的情况下完成这些任务,可以使用修改表…分区…,如图所示:

    修改表成员分区(YEAR(dob)