相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 41.5 mb
PDF (A4)- 41.6 mb
手册页(TGZ)- 262.1 kb
手册页(Zip)- 372.2 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

MySQL 8.0参考手册/分区/ MySQL分区概述

24.1 MySQL分区概述

本节提供MySQL 8.0中分区的概念概述。

有关分区限制和特性限制的信息,请参见第24.6节“分区的限制和限制”

SQL标准并没有提供太多关于数据存储的物理方面的指导。SQL语言本身旨在独立于它所使用的模式、表、行或列下面的任何数据结构或介质。尽管如此,大多数先进的数据库管理系统已经发展出了一些确定用于存储特定数据块的物理位置的方法,包括文件系统、硬件甚至两者。在MySQL中,InnoDB存储引擎长期以来一直支持表空间的概念(参见第15.6.3节,“表空间”),而MySQL服务器,即使在引入分区之前,也可以配置为使用不同的物理目录来存储不同的数据库(参见第8.12.2节“使用符号链接”,以了解如何做到这一点)。

分区将这个概念更进一步,允许您根据您可以根据需要设置的规则在文件系统中分布各个表的部分。实际上,表的不同部分作为单独的表存储在不同的位置。用户选择的用于完成数据分割的规则称为分区功能,在MySQL中可以是模量,简单匹配一组范围或值列表,内部哈希函数,或线性哈希函数。该函数根据用户指定的分区类型进行选择,并将用户提供的表达式的值作为其参数。这个表达式可以是一个列值、作用于一个或多个列值的函数,也可以是一个或多个列值的集合,这取决于所使用的分区类型。

在这种情况下范围列表,及[线性哈希分区时,将分区列的值传递给分区函数,该函数返回一个整数值,表示应该存储特定记录的分区的编号。这个函数必须是非常数和非随机的。它可能不包含任何查询,但可以使用在MySQL中有效的SQL表达式,只要该表达式返回或者整数intval中这样

maxvalue < =intval中< = MAXVALUE

MAXVALUE用于表示所讨论整数类型的最小上界。maxvalue表示最大下界。)

对于[线性关键范围列,名单列分区,分区表达式由一个或多个列的列表组成。

对于[线性关键分区,分区函数由MySQL提供。

有关允许的分区列类型和分区函数的详细信息,请参见第24.2节“分区类型”,以及第13.1.20节“CREATE TABLE语句”,其中提供了分区语法描述和其他示例。有关分区函数限制的信息,请参见第24.6.3节,与函数相关的分区限制

这被称为水平分区也就是说,一个表的不同行可以分配给不同的物理分区。MySQL 8.0不支持垂直分区,其中表的不同列被分配到不同的物理分区。目前还没有在MySQL中引入垂直分区的计划。

要创建分区表,必须使用支持分区表的存储引擎。在MySQL 8.0中,同一个分区表的所有分区必须使用相同的存储引擎。但是,没有什么可以阻止您在同一个MySQL服务器上甚至在同一个数据库中为不同的分区表使用不同的存储引擎。

在MySQL 8.0中,唯一支持分区的存储引擎是InnoDB而且NDB.分区不能与不支持分区的存储引擎一起使用;其中包括MyISAM合并CSV,联邦存储引擎。

分区的关键线性关键是可能的NDB,但使用此存储引擎的表不支持其他类型的用户定义分区。此外,NDB使用用户定义分区的表必须有一个显式的主键,并且表的分区表达式中引用的任何列都必须是主键的一部分。方法中没有列出列按键分区线性键划分的条款创建表ALTER TABLE用于创建或修改用户分区的语句NDB表,则表不需要显式主键。有关更多信息,请参见第23.2.7.1节“NDB集群中的SQL语法不符合”

在创建分区表时,使用默认存储引擎,就像创建任何其他表一样;方法重写此行为,只需使用(存储)引擎选项,就像未分区的表一样。目标存储引擎必须提供本地分区支持,否则语句将失败。你应该记住这一点(存储)引擎(和其他表选项)需要列出之前中使用的任何分区选项创建表声明。此示例显示如何创建一个表,该表通过哈希划分为6个分区,并使用InnoDB的值default_storage_engine):

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)

每一个分区子句可以包含(存储)引擎选项,但在MySQL 8.0中没有效果。

除非另有说明,本讨论中的其余示例假定default_storage_engineInnoDB

重要的

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

属性将每个分区的数据和索引分配给特定目录数据目录而且索引目录的选项分区的条款创建表用于创建分区表的语句。

只有数据目录的单独分区和子分区支持InnoDB表。从MySQL 8.0.21开始,a中指定的目录数据目录条款必须知道InnoDB.有关更多信息,请参见使用DATA DIRECTORY子句

表的分区表达式中使用的所有列必须是表可能拥有的每个唯一键的一部分,包括任何主键。这意味着如下SQL语句创建的表不能被分区:

创建表tnp (id INT NOT NULL AUTO_INCREMENT, ref BIGINT NOT NULL, name VARCHAR(255),主键pk (id), UNIQUE KEY uk (name));

因为钥匙pk而且英国没有公共列,则分区表达式中没有可用的列。在这种情况下,可能的解决方法包括添加的名字列到表的主键,将id英国,或简单地删除唯一键。看到第24.6.1节“分区键、主键和唯一键”,以获取更多资料。

此外,MAX_ROWS而且MIN_ROWS可分别用于确定每个分区中可存储的最大和最小行数。看到第24.3节“分区管理”,以了解更多有关这些选项的资料。

MAX_ROWS选项也可以用于创建带有额外分区的NDB集群表,从而允许更大的哈希索引存储。的文档10bet官方网站DataMemory数据节点配置参数,以及第23.2.2节“NDB集群节点、节点组、片段副本和分区”,以获取更多资料。

下面列出了分区的一些优点:

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

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

  • 由于数据满足给定条件,一些查询可以得到极大的优化在哪里子句只能存储在一个或多个分区上,这将自动从搜索中排除任何剩余分区。因为分区可以在创建分区表之后更改,所以可以重新组织数据以增强在分区方案首次设置时可能不经常使用的频繁查询。这种排除不匹配分区(以及它们包含的任何行)的能力通常被称为分区修剪.有关更多信息,请参见第24.4节,“分区修剪”

    此外,MySQL支持显式的分区选择查询。例如,SELECT * FROM t PARTITION (p0,p1) WHERE c < 5只选择分区中的那些行p0而且p1这与在哪里条件。在这种情况下,MySQL不检查表的任何其他分区t;当您已经知道希望检查哪个或哪个分区时,这可以大大加快查询速度。数据修改语句也支持分区选择删除插入取代更新,加载数据加载XML.有关更多信息和示例,请参阅这些语句的描述。