22.1 MySQL 分区概述

本节提供了 MySQL 5.7 中分区的概念性概述。

有关分区限制和功能限制的信息,请参见第 22.6 节“分区的限制和限制”

SQL 标准没有提供太多有关数据存储物理方面的指导。 SQL 语言本身旨在独立于与其配合使用的模式,table,行或列基础的任何数据结构或媒体。尽管如此,大多数先进的数据库 Management 系统已经 Developing 了一些方法来确定要用于存储特定数据的物理位置的文件系统,硬件或什至两者。在 MySQL 中,InnoDB存储引擎长期以来一直支持 table 空间的概念,并且即使在引入分区之前,MySQL Server 仍可以配置为使用不同的物理目录来存储不同的数据库(请参见第 8.12.3 节“使用符号链接”,以获取有关如何进行存储的解释)。这个做完了)。

分区使您可以根据需要在很大程度上设置的规则在文件系统中分布各个 table 的各个部分,从而使这一概念更进一步。实际上,table 的不同部分作为单独的 table 存储在不同的位置。用户选择的用来完成数据划分的规则称为分区函数,在 MySQL 中可以是模数,与一组范围或值列 table 的简单匹配,内部哈希函数或线性哈希函数。该函数根据用户指定的分区类型进行选择,并将用户提供的 table 达式的值作为其参数。此 table 达式可以是列值,作用于一个或多个列值的函数或一组一个或多个列值,具体取决于所使用的分区类型。

RANGELIST和[+10+] HASH分区的情况下,分区列的值传递给分区函数,该函数返回一个整数值,该整数值 table 示应在其中存储该特定记录的分区号。此函数必须是非恒定且非随机的。它可能不包含任何查询,但是可以使用在 MySQL 中有效的 SQLtable 达式,只要该 table 达式返回NULL或整数* intval *

-MAXVALUE <= intval <= MAXVALUE

(MAXVALUE用于 table 示所讨论整数类型的最小上限.-MAXVALUEtable 示最大下限.)

对于[+18+] KEYRANGE COLUMNSLIST COLUMNS分区,分区 table 达式由一列或多列的列 table 组成。

对于[+22+] KEY分区,分区功能由 MySQL 提供。

有关允许的分区列类型和分区函数的更多信息,请参见第 22.2 节“分区类型”第 13.1.18 节“ CREATE TABLE 语句”,它们提供了分区语法说明和其他示例。有关分区功能限制的信息,请参见第 22.6.3 节“与功能有关的分区限制”

这称为水平分区-也就是说,table 的不同行可以分配给不同的物理分区。 MySQL 5.7 不支持垂直分区,在垂直分区中,table 的不同列被分配给不同的物理分区。目前尚无计划将垂直分区引入 MySQL。

有关确定 MySQL Server 二进制文件是否支持用户定义的分区的信息,请参见第 22 章,分区

为了创建分区 table,您可以使用 MySQL 服务器支持的大多数存储引擎。 MySQL 分区引擎在单独的层中运行,并且可以与其中任何一个进行交互。在 MySQL 5.7 中,同一分区 table 的所有分区都必须使用相同的存储引擎。例如,您不能将MyISAM用于一个分区,并将InnoDB用于另一个分区。但是,没有什么可以阻止您对同一 MySQL 服务器甚至同一数据库中的不同分区 table 使用不同的存储引擎。

MySQL 分区不能与MERGECSVFEDERATED存储引擎一起使用。

NDB可以通过KEYLINEAR KEY进行分区,但是使用此存储引擎的 table 不支持其他类型的用户定义分区。此外,使用用户定义的分区的NDBtable 必须具有显式主键,并且该 table 的分区 table 达式中引用的任何列都必须是主键的一部分。但是,如果在用于创建或修改用户分区的NDBtable 的CREATE TABLEALTER TABLE语句的PARTITION BY KEYPARTITION BY LINEAR KEY子句中未列出任何列,则不需要该 table 具有显式主键。有关更多信息,请参见第 21.1.7.1 节“ NDB 集群中不符合 SQL 语法”

要将特定的存储引擎用于分区 table,只需要像使用未分区 table 一样使用[STORAGE] ENGINE选项。但是,请记住,在CREATE TABLE语句中使用任何分区选项之前,必须先列出[STORAGE] ENGINE(和其他 table 选项)。此示例显示如何创建一个按哈希 table 划分为 6 个分区并使用InnoDB存储引擎的 table:

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
    ENGINE=INNODB
    PARTITION BY HASH( MONTH(tr_date) )
    PARTITIONS 6;

每个PARTITION子句都可以包含[STORAGE] ENGINE选项,但是在 MySQL 5.7 中无效。

Important

分区适用于 table 的所有数据和索引。您不能仅对数据进行分区,而不能对索引进行分区,反之亦然,也不能仅对 table 的一部分进行分区。

可以使用用于创建分区 table 的CREATE TABLE语句的PARTITION子句的DATA DIRECTORYINDEX DIRECTORY选项将每个分区的数据和索引分配给特定目录。

Windows 上MyISAMtable 的单个分区或子分区不支持DATA DIRECTORYINDEX DIRECTORY

InnoDBtable 的各个分区和子分区仅支持DATA DIRECTORY选项。

该 table 的分区 table 达式中使用的所有列都必须是该 table 可能具有的每个唯一键(包括任何主键)的一部分。这意味着无法对由以下 SQL 语句创建的此类 table 进行分区:

CREATE TABLE tnp (
    id INT NOT NULL AUTO_INCREMENT,
    ref BIGINT NOT NULL,
    name VARCHAR(255),
    PRIMARY KEY pk (id),
    UNIQUE KEY uk (name)
);

由于键pkuk没有共同的列,因此分区 table 达式中没有可用的列。在这种情况下,可能的解决方法包括将name列添加到 table 的主键,将id列添加到uk或仅完全删除唯一键。有关更多信息,请参见第 22.6.1 节“分区键,主键和唯一键”

此外,MAX_ROWSMIN_ROWS可以分别用于确定可存储在每个分区中的最大行数和最小行数。有关这些选项的更多信息,请参见第 22.3 节“分区 Management”

MAX_ROWS选项对于创建具有额外分区的 NDB 群集 table 也很有用,从而可以更好地存储哈希索引。有关更多信息,请参阅DataMemory数据节点配置参数以及第 21.1.2 节“ NDB 群集节点,节点组,副本和分区”的文档。

这里列出了分区的一些优点:

  • 分区使在一个 table 中存储的数据比单个磁盘或文件系统分区中存储的数据更多。

  • 通常,通过删除仅包含该数据的一个或多个分区,可以轻松地从分区 table 中删除失去其用途的数据。相反,在某些情况下,通过添加一个或多个用于专门存储该数据的新分区,可以大大简化添加新数据的过程。

  • 由于满足给定WHERE子句的数据只能存储在一个或多个分区上,因此可以大大优化某些查询,这会自动从搜索中排除任何剩余的分区。由于可以在创建分区 table 后更改分区,因此您可以重新组织数据以增强在首次设置分区方案时可能不经常使用的频繁查询。排除不匹配分区(因此包含的任何行)的能力通常称为分区修剪。有关更多信息,请参见第 22.4 节“分区修剪”

另外,MySQL 支持显式的分区选择查询。例如,选择*从 t 分区(p0,p1)中 c <5仅选择分区p0p1中与WHERE条件匹配的那些行。在这种情况下,MySQL 不会检查 tablet的任何其他分区;当您已经知道要检查的分区时,这可以大大加快查询速度。数据修改语句DELETEINSERTREPLACEUPDATELOAD DATALOAD XML也支持分区选择。有关更多信息和示例,请参见这些语句的描述。