26.2.3.2 列表分区
MySQL 8.4 支持 LIST COLUMNS
分区。这是 LIST
分区的一个变体,允许使用多个列作为分区键,并且可以将非整数类型的列(如字符串、DATE
和 DATETIME
)作为分区键。 (有关 COLUMNS
分区列允许的数据类型的更多信息,请参阅Section 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()
子句中使用表达式将列值转换为整数。 (实际上,除了列名之外,不允许使用其他表达式。)
此外,还可以使用 DATE
和 DATETIME
列,如下所示的例子使用相同的名称和列来显示之前展示的 customers_1
表,但基于 renewal
列对客户帐户在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')
);
这有效,但是如果涉及的日期数量非常大时,定义和维护会变得繁琐;在这种情况下,通常更实用的是使用 RANGE
或 RANGE 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')
);
请参阅Section 26.2.3.1, “RANGE COLUMNS 分区”
,获取更多信息。
此外(与 RANGE COLUMNS
分区相同),您可以在 COLUMNS()
子句中使用多个列。
请参阅Section 15.1.20, “CREATE TABLE 语句”
,获取有关 PARTITION BY LIST COLUMNS()
语法的更多信息。