MySQL分区/分区在MySQL的概述

第二章概述MySQL的分区

本节提供了一个概念性的概述在MySQL 8.0分区。

分区限制和功能限制的更多信息,请参阅第六章,限制和限制分区

SQL标准没有提供太多关于数据存储的物理方面的指导。SQL语言本身的目的是独立工作的任何数据结构或媒体的模式、表、行、列,它的工作原理。尽管如此,最先进的数据库管理系统已经进化的一些手段确定物理位置用于存储特定数据的文件系统,硬件,甚至两个。在MySQL中,InnoDB存储引擎一直支持表空间的概念(见表空间)和MySQL服务器,甚至引入分区前,可以配置为使用不同的物理目录来存储不同的数据库(见使用符号链接这是如何实现的,对于一个解释)。

分区将这个概念进一步,通过使你分配的部分个体表跨文件系统根据规则可以设置主要是必要的。实际上,不同部分的一个表存储作为单独的表在不同的位置。用户选择规则的部门的数据是被称为来完成的分区功能在MySQL可以模量,简单的匹配对一组范围或值列表,一个内部哈希函数,或一个线性哈希函数。选择功能根据用户指定的分区类型,并以用户提供的表达式的值作为参数。这个表达式可以是列值,函数作用于一个或多个列值,或一组一个或多个列值,根据分区所使用的类型。

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

maxvalue < =intval中< = MAXVALUE

(MAXVALUE用于表示的整数类型的最小上界问题。maxvalue代表了最大下界。)

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

对于[线性]关键分区,分区函数是由MySQL。

关于允许分区列类型的更多信息和分区功能,看看第三章,分区类型,以及CREATE TABLE语句,它提供了分区语法描述和额外的例子。分区功能,限制信息6.3节,“功能分区相关的限制”

这就是所谓的水平分区,也就是不同的表行可能被分配到不同的物理分区。MySQL 8.0不支持垂直分区,不同的列一个表被分配到不同的物理分区。没有计划在这个时候在MySQL中引入垂直分区。

创建分区表,您必须使用一个存储引擎,支持他们。在MySQL 8.0中,所有分区的分区表必须使用相同的存储引擎。然而,没有什么阻止你使用不同的存储引擎不同的分区表相同的MySQL服务器,甚至在同一个数据库中。

在MySQL 8.0中,唯一的存储引擎,支持分区InnoDBNDB。分区不能用于存储引擎不支持;其中包括MyISAM,合并,CSV,联邦存储引擎。

分区的关键线性关键是可能的,NDB,但不支持其他类型的用户定义的分区表使用这个存储引擎。此外,一个NDB表,使用用户定义的分区必须有一个明确的主键,和任何列中引用表的分区表达式必须是主键的一部分。然而,如果没有列中列出分区的关键通过线性键分区条款的创建表ALTER TABLE语句用于创建或修改一个user-partitionedNDB表,表不需要有一个明确的主键。有关更多信息,请参见不遵守NDB集群中的SQL语法

创建分区表时,使用的是默认的存储引擎创建任何其他表时一样;要覆盖此行为,它只使用是必要的(存储)引擎选项就像不分区的表。目标存储引擎必须提供本地分区支持,或语句失败。你应该记住(存储)引擎(和其他表选项)需要列出之前任何分区选项中使用创建表声明。这个例子展示了如何创建一个表由散列分区成6分区和使用InnoDB存储引擎(不管的价值default_storage_engine):

创建表ti (INT id,数量小数(7,2),tr_date日期)引擎= INNODB由散列分区(tr_date)(月)分区6;

每一个分区条款可以包括(存储)引擎MySQL 8.0中选择,但这没有影响。

除非另有规定,剩下的例子在这个讨论假设default_storage_engineInnoDB

重要的

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

数据和索引为每个分区可以分配给一个特定的目录中使用数据目录索引目录选项分区条款的创建表语句用于创建分区表。

只有数据目录选择是支持个人的分区和subpartitionsInnoDB表。MySQL 8.0.21,在一个指定的目录数据目录条款必须是已知的InnoDB。有关更多信息,请参见使用数据目录条款

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

创建表tnp (id INT NOT NULL AUTO_INCREMENT ref BIGINT NOT NULL,名字VARCHAR(255),主键pk (id),英国唯一键(名称));

因为钥匙pk英国没有列共同点,没有可用列一个分区的表达式。在这种情况下可能的解决方法包括添加的名字列到表的主键,添加id英国,或者干脆完全删除唯一键。看到6.1节,“分区键、主键和惟一键”为更多的信息。

此外,MAX_ROWSMIN_ROWS可以用来确定最大和最小数量的行,分别可以存储在每个分区中。看到第四章,分区管理关于这些选项的更多信息。

MAX_ROWS选项也可以用于创建NDB集群表分区,从而允许更大的散列存储索引。看到的文档10bet官方网站DataMemory数据节点配置参数,以及NDB集群节点、节点组片段副本,分区为更多的信息。

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

  • 分区可以存储更多的数据在一个表可以举行一个磁盘或文件系统分区。

  • 数据失去效用通常可以很容易从一个分区表被删除分区(或分区)只包含这些数据。相反,添加新数据的过程在某些情况下可以大大促进通过添加一个或多个新的分区专门用于存储这些数据。

  • 一些查询可以大大优化数据满足给定的事实在哪里条款只可以存储在一个或多个分区,从搜索自动排除任何剩余的分区。因为分区可以更改创建分区表后,你可以重新组织数据以提高频繁查询时可能没有被经常使用的分区方案最初设置。这种排除的能力匹配的分区(因此它们包含任何行)通常被称为分区修剪。有关更多信息,请参见第五章,分区修剪

    此外,MySQL支持显式分区选择查询。例如,SELECT * FROM t分区(p0, p1) c < 5在分区只选择那些行p0p1相匹配的在哪里条件。在这种情况下,MySQL不检查任何其他分区的表t;这可以大大加快查询,当你已经知道你想检查分区或分区。分区的选择还支持数据修改语句删除,插入,取代,更新,加载数据,加载XML。看到这些语句的描述的更多信息和示例。