原文链接:https://blog.mclaughlinsoftware.com/2022/05/30/mysql-partitioned-tables/
作者:Michael McLaughlin
学习成果
- 了解列表分区。
- 了解范围分区。
- 了解列分区。
- 了解哈希分区。
- 了解密钥分区。
- 了解子分区。
教材
MySQL 支持表的分区。它支持范围、列表、哈希和键分区。范围分区允许您根据在给定范围内的列值进行分区。列表分区允许您根据与一组离散值中的一个匹配的列进行分区。哈希分区允许您根据用户定义表达式的返回值(存储的 SQL/PSM 函数的结果)进行分区。键分区执行类似于散列分区,但它允许用户从表的列集中选择一个或多个列;哈希为您管理选择过程。散列是一种组织数据类型键的方法,散列加快了对表中数据的读取和更改的访问。
以下每个小节都讨论了 MySQL 中支持的一种分区形式。自然,其他数据库和 MySQL 的实现是有区别的。
列表分区
MySQL 列表分区通过识别包含整数值的列来工作,在以下示例中为特许经营编号。分区子句遵循列和约束的列表,并要求分区键位于主键或索引中。
以下列表分区适用于文字数值。 MySQL 对列表分区使用 IN 关键字。请注意,没有指定主键,并且索引位于自动递增代理键列上。提供了一个完整的示例以避免混淆如何索引分区键:
当分区键不是主键时,在franchise_id 列上包含 PRIMARY KEY 约束将触发 ERROR 1503。错误消息的原因是主键隐式创建唯一索引,并且该索引会与按列表分区指令冲突。当您想要在非主键列上进行分区时,需要在 Franchise_id 列上使用非唯一 idx 索引。
范围分区
范围分区仅适用于整数值或解析为针对主键列的整数的表达式。整数的限制促使选择整数列进行范围分区的必要性。除非主键成为您的分区键,否则您不能使用 PRIMARY KEY 约束定义范围分区表,例如:
范围分区最适合您希望根据整数列分成较小部分的大型表。您还可以使用返回整数作为分区键的存储函数,而不是显示的数字文字。 MySQL 中几乎没有其他选项可用。
列分区
列分区是范围和列表分区的新变体。它包含在 MySQL 5.5 及更高版本中。范围和列表分区都适用于基于整数的列(使用 TINYINT、SMALLINT、MEDIUMINT、INT [别名 INTEGER] 和 BIGINT)。列分区通过扩展分区列的可能数据类型以包括 CHAR、VARCHAR、BINARY 和 VARBINARY 字符串数据类型以及 DATE、DATETIME 或 TIMESTAMP 数据类型来扩展这些模型。您仍然不能使用其他数字数据类型,例如 DECIMAL 和 FLOAT。根据 MySQL 错误 42849,TIMESTAMP 数据类型也仅在范围分区中可用,但需要注意您使用 UNIX_TIMESTAMP 函数。
哈希分区
散列分区确保行在预定数量的分区上的均匀分布。这可能是快速对表进行分区以测试对大表进行分区的结果的最简单方法。您应该将散列分区基于代理或自然主键。
下面提供了排序表的修改示例:
这是受益于 PRIMARY KEY 约束的分区类型,因为它会自动创建一个可以被散列使用的唯一索引。非唯一索引(例如列表分区示例)不适用于散列分区。
密钥分区
键分区很有价值,因为您可以在非整数列上进行分区。除了 MySQL 服务器使用自己的散列表达式之外,它执行散列分区的行。
当您想按日期范围进行分区时,这是唯一的选择。像散列分区一样,它很容易部署。唯一需要考虑的是要对表中的数据进行切片的数量。
子分区
子分区的概念也称为复合分区。您可以使用散列、线性散列或线性键对范围进行子分区或列出分区。
为了演示复合分区,需要对先前创建的排序表稍作更改:我们将在表定义中添加一个 store_id 列。以下是一个由哈希子分区的范围分区示例:
CREATE TABLE ordering INT UNSIGNED INT UNSIGNED DATE ( ordering_id INT UNSIGNED AUTO_INCREMENT , item_id INT UNSIGNED , store_id INT UNSIGNED , rental_amount DECIMAL(15,2) , rental_date DATE , index idx (ordering_id)) PARTITION BY RANGE(item_id) SUBPARTITION BY HASH(store_id) SUBPARTITIONS 4 ( PARTITION jan2011 VALUES LESS THAN (10000) , PARTITION feb2011 VALUES LESS THAN (20000) , PARTITION mar2011 VALUES LESS THAN (30000));
复制
复合分区很重要,可能需要一些实验才能获得最佳结果。在部署解决方案之前,计划对不同场景进行一些测试。