Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  LIST COLUMNS partitioning

26.2.3.2 LIST COLUMNS 分区

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

假设您拥有一个业务,拥有 12 个城市的客户,您将这些城市分为 4 个区域,每个区域有 3 个城市,如下表所示:

Region Cities
1 奥斯卡汉姆、霍格斯比、蒙斯特罗斯
2 维姆贝里、胡尔特斯弗雷德、韦斯特维克
3 内什约、埃克什约、韦特兰达
4 乌普维丁格、阿尔韦斯塔、韦克什约

使用 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 表相同的名称和列,但使用 LIST COLUMNS 分区基于 renewal 列,将行存储在 4 个分区中,根据 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')
);

这可以工作,但如果涉及的日期数量非常大,定义和维护将变得非常cumbersome;在这种情况下,通常更实用的是使用 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')
);

请参见 第 26.2.3.1 节,“RANGE COLUMNS 分区”,以获取更多信息。

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

请参见 第 15.1.20 节,“CREATE TABLE 语句”,以获取关于 PARTITION BY LIST COLUMNS() 语法的更多信息。