MySQL 9.0 提供對 LIST COLUMNS
分區的支援。這是 LIST
分區的一種變體,它允許使用多個資料行作為分區鍵,並允許使用整數類型以外的資料類型資料行作為分區資料行;您可以使用字串類型、DATE
和 DATETIME
資料行。(有關 COLUMNS
分區資料行允許的資料類型詳細資訊,請參閱第 26.2.3 節,「COLUMNS 分區」。)
假設您擁有一家企業,其客戶分佈在 12 個城市,為了銷售和行銷目的,您將它們組織成 4 個區域,每個區域有 3 個城市,如下表所示
區域 | 城市 |
---|---|
1 | 奧斯卡港 (Oskarshamn)、赫格斯比 (Högsby)、門斯特羅斯 (Mönsterås) |
2 | 維默比 (Vimmerby)、胡爾茨弗雷德 (Hultsfred)、韋斯特維克 (Västervik) |
3 | 內舍 (Nässjö)、埃克斯舍 (Eksjö)、韋特蘭達 (Vetlanda) |
4 | 烏普維丁厄 (Uppvidinge)、阿爾韋斯塔 (Alvesta)、韋克舍 (Växjo) |
使用 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()
不允許使用資料行名稱以外的運算式。)
也可以使用 DATE
和 DATETIME
資料行,如下例所示,該範例使用與先前顯示的 customers_1
資料表相同的名稱和資料行,但根據 renewal
資料行採用 LIST COLUMNS
分區,將資料列儲存在 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')
);
這可行,但如果涉及的日期數量變得非常多,則定義和維護起來會變得繁瑣;在這種情況下,通常更實用的是改用 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')
);
如需更多資訊,請參閱第 26.2.3.1 節,「RANGE COLUMNS 分區」。
此外(與 RANGE COLUMNS
分區一樣),您可以在 COLUMNS()
子句中使用多個資料行。
有關 PARTITION BY LIST COLUMNS()
語法的其他資訊,請參閱第 15.1.20 節,「CREATE TABLE 陳述式」。