MySQL 8.4 参考手册  /  ...  /  LIST COLUMNS 分区

26.2.3.2 LIST COLUMNS 分区

MySQL 8.4 提供了对 LIST COLUMNS 分区的支持。这是 LIST 分区的变体,它允许使用多个列作为分区键,以及使用除整数类型以外的数据类型作为分区列;可以使用字符串类型、DATEDATETIME 列。(有关 COLUMNS 分区列允许的数据类型的更多信息,请参阅 第 26.2.3 节,“COLUMNS 分区”。)

假设您的公司在 12 个城市拥有客户,为了销售和市场营销目的,您将这些城市组织成 4 个区域,每个区域包含 3 个城市,如下表所示

区域 城市
1 奥斯卡斯汉姆、霍格斯比、蒙斯特拉斯
2 维默比、胡尔特斯弗雷德、韦斯特维克
3 奈斯约、埃克斯约、维特兰达
4 乌普维丁格、阿尔维斯塔、韦克斯约

使用 LIST COLUMNS 分区,您可以为客户数据创建一个表,该表根据客户居住的城市名称将行分配到 4 个分区中的任何一个,如下所示

Press CTRL+C to copy
CREATE TABLE customers_1 ( first_name VARCHAR(25), last_name VARCHAR(25), street_1 VARCHAR(30), street_2 VARCHAR(30), city VARCHAR(15), renewal DATE ) PARTITION BY LIST COLUMNS(city) ( PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Högsby', 'Mönsterås'), PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Västervik'), PARTITION pRegion_3 VALUES IN('Nässjö', 'Eksjö', 'Vetlanda'), PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Växjo') );

与通过 RANGE COLUMNS 分区一样,您不需要在 COLUMNS() 子句中使用表达式将列值转换为整数。(实际上,除列名以外的表达式不允许在 COLUMNS() 中使用。)

也可以使用 DATEDATETIME 列,如以下示例所示,该示例使用与之前显示的 customers_1 表相同的名称和列,但使用 LIST COLUMNS 分区,根据 renewal 列将行存储在 4 个分区中的一个中,具体取决于客户帐户在 2010 年 2 月的哪一周到期

Press CTRL+C to copy
CREATE TABLE customers_2 ( first_name VARCHAR(25), last_name VARCHAR(25), street_1 VARCHAR(30), street_2 VARCHAR(30), city VARCHAR(15), renewal DATE ) PARTITION BY LIST COLUMNS(renewal) ( PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03', '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'), PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10', '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'), PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17', '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'), PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24', '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28') );

这可以工作,但是如果涉及的日期数量非常多,则定义和维护起来会很麻烦;在这种情况下,通常使用 RANGERANGE COLUMNS 分区更实际。在本例中,由于我们希望用作分区键的列是 DATE 列,因此我们使用 RANGE COLUMNS 分区,如下所示

Press CTRL+C to copy
CREATE TABLE customers_3 ( first_name VARCHAR(25), last_name VARCHAR(25), street_1 VARCHAR(30), street_2 VARCHAR(30), city VARCHAR(15), renewal DATE ) PARTITION BY RANGE COLUMNS(renewal) ( PARTITION pWeek_1 VALUES LESS THAN('2010-02-09'), PARTITION pWeek_2 VALUES LESS THAN('2010-02-15'), PARTITION pWeek_3 VALUES LESS THAN('2010-02-22'), PARTITION pWeek_4 VALUES LESS THAN('2010-03-01') );

有关详细信息,请参阅 第 26.2.3.1 节,“RANGE COLUMNS 分区”

此外(与 RANGE COLUMNS 分区一样),您可以在 COLUMNS() 子句中使用多个列。

有关 PARTITION BY LIST COLUMNS() 语法的更多信息,请参阅 第 15.1.20 节,“CREATE TABLE 语句”