相关的文档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.6 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, name VARCHAR(50), bought DATE) -> PARTITION BY RANGE(YEAR(bought)) (-> 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 bought BETWEEN '1995-01-01' AND '1999-12-31';+------+-------------+------------+ | id |名称|购买  | +------+-------------+------------+ | 闹钟2 | | 1997-11-05 | | 10 |熔岩灯| 1998-12-25  | +------+-------------+------------+ 2行集(0.00秒)

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

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

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

删除命名为p2,执行以下命令:

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

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

记住这一点非常重要,删除分区时,也会删除存储在该分区中的所有数据.您可以通过重新运行前面的选择查询:

mysql> SELECT * FROM WHERE bought -> 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。row *************************** Table: tr Create Table: Create Table ' tr ' (' id ' int(11) DEFAULT NULL, ' name ' varchar(50) DEFAULT NULL, ' deleted ' date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE(年(已购买))(分区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, 'pencil holder', '1995-07-12');查询OK, 1 row affected (0.00 sec) mysql> SELECT * FROM tr WHERE bought -> 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下降;查询OK, 0 rows affected (0.03 sec) mysql> SELECT * FROM tr WHERE bought -> BETWEEN '1995-01-01' AND '2004-12-31';空集(0.00秒)

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

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

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

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

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

添加分区(PARTITION p3 VALUES小于(2010));

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

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

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

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

使用显示创建表你可以看到ALTER TABLE这句话取得了预期的效果:

mysql >显示创建表成员\ G  *************************** 1。row *************************** Table: members 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分区范围(年(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 Partition Operations”

你也可以用修改表…添加分区向分区的表添加新分区列表.假设有一张表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如图所示:

ALTER TABLE tt ADD PARTITION (PARTITION p2 VALUES IN (7,14,21));

请记住,你不能添加一个新的列表包含已包含在现有分区值列表中的任何值的分区。如果你试图这样做,一个错误的结果:

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

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

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

CREATE TABLE employees (id INT NOT NULL, fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL, hired DATE NOT NULL)分区范围(YEAR(hired))(分区p1值小于(1991),分区p2值小于(1996),分区p3值小于(2001),分区p4值小于(2005));增加分区(p5分区值小于(2010),p6分区值小于MAXVALUE);

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

mysql >显示创建表成员\ G  *************************** 1。row *************************** Table: members 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分区范围(年(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为了达到这个目的:

将分区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);

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

ALTER TABLE tt ADD PARTITION (PARTITION np VALUES IN (4,8));重组分区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在这种情况下。)

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

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