MySQL 8.0 参考手册  / 第24章分区  / 24.2 分区类型  / 24.2.3 列分区  /  24.2.3.2 LIST COLUMNS 分区

24.2.3.2 LIST COLUMNS 分区

MySQL 8.0 提供了对LIST COLUMNS分区的支持。这是 LIST分区的一种变体,可以使用多个列作为分区键,并且对于整数类型以外的数据类型的列可以用作分区列;您可以使用字符串类型 DATE、 和 DATETIME列。(有关 COLUMNS分区列允许的数据类型的更多信息,请参阅 第 24.2.3 节,“COLUMNS 分区”。)

假设您的企业在 12 个城市拥有客户,出于销售和营销目的,您将其组织为 3 个城市的 4 个区域,如下表所示:

地区 城市
1个 Oskarshamn、Högsby、Mönsterås
2个 Vimmerby、Hultsfred、Västervik
3个 Nässjö, Eksjö, Vetlanda
4个 Uppvidinge, Alvesta, 韦克舍

通过LIST COLUMNS分区,您可以为客户数据创建一个表,根据客户所在城市的名称将一行分配给与这些区域对应的 4 个分区中的任何一个,如下所示:

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,但根据 2010 年 2 月的星期使用LIST COLUMNS基于列的分区将行存储在 4 个分区之一中renewal客户的帐户计划续订:

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分区,如下所示:

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')
);

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

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

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