MySQL 9.0 參考手冊  /  ...  /  LIST COLUMNS 分區

26.2.3.2 LIST COLUMNS 分區

MySQL 9.0 提供對 LIST COLUMNS 分區的支援。這是 LIST 分區的一種變體,它允許使用多個資料行作為分區鍵,並允許使用整數類型以外的資料類型資料行作為分區資料行;您可以使用字串類型、DATEDATETIME 資料行。(有關 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() 不允許使用資料行名稱以外的運算式。)

也可以使用 DATEDATETIME 資料行,如下例所示,該範例使用與先前顯示的 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')
);

這可行,但如果涉及的日期數量變得非常多,則定義和維護起來會變得繁瑣;在這種情況下,通常更實用的是改用 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() 子句中使用多個資料行。

有關 PARTITION BY LIST COLUMNS() 語法的其他資訊,請參閱第 15.1.20 節,「CREATE TABLE 陳述式」