22.2.3.2 LIST COLUMNS 分区

MySQL 5.7 提供对LIST COLUMNS分区的支持。这是LIST分区的一种变体,它可以将多个列用作分区键,并且可以将除整数类型之外的数据类型的列用作分区列;您可以使用字符串类型DATEDATETIME列。 (有关COLUMNS分区列的允许的数据类型的更多信息,请参见第 22.2.3 节“列分区”。)

假设您的业务在 12 个城市拥有 Client,出于销售和市场营销目的,您将组织成 3 个城市的 4 个区域,如下 table 所示:

RegionCities
1Oskarshamn,Högsby,门斯特罗斯
2维默比(Vimmerby),霍特斯弗雷德(Hultsfred),韦斯特维克(Västervik)
3Nässjö,Eksjö,维特兰达
4Uppvidinge,阿尔韦斯塔,韦克舍

使用LIST COLUMNS分区,您可以为 Client 数据创建一个 table,该 table 根据 Client 所居住城市的名称为与这些 locale 相对应的 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()子句中使用 table 达式将列值转换为整数。 (实际上,COLUMNS()不允许使用除列名之外的其他 table 达式.)

也可以使用DATEDATETIME列,如以下示例所示,该示例使用与先前显示的customers_1table 相同的名称和列,但根据renewal列采用LIST COLUMNS分区将行存储在 4 个分区之一中,具体取决于该 Client 的帐户计划在 2010 年 2 月这一周进行续订:

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

有关更多信息,请参见第 22.2.3.1 节“ RANGE COLUMNS 分区”

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

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