LIST 分區 根據列值是否屬於預定義的**離散值集合** 分配分區。與 RANGE 的連續區間不同,LIST 針對枚舉型、分類型業務:
CREATE TABLE employees (
id INT NOT NULL,
store_id INT
)
PARTITION BY LIST (store_id) (
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);
-- 西區門店整體出售,秒級刪除相關數據 (元數據操作,不掃描行)
ALTER TABLE employees DROP PARTITION pWest;
-- 對比:DELETE 需全表掃描、產生大量 undo/binlog、鎖衝突
DELETE FROM employees WHERE store_id IN (4,12,13,14,18);
-- store_id=21 不在任何分區值列表中
INSERT INTO employees VALUES (224, 'Linus', 'Torvalds', ..., 21);
-- ERROR 1526 (HY000): Table has no partition for value 21
解決方案:
LIST 可作為一級分區,二級採用 HASH/KEY 子分區:
CREATE TABLE sales (
id INT,
region_id INT,
sale_date DATE
)
PARTITION BY LIST (region_id)
SUBPARTITION BY HASH (MONTH(sale_date))
SUBPARTITIONS 12
(
PARTITION pNorth VALUES IN (1,2,3),
PARTITION pSouth VALUES IN (4,5,6)
);
-- 實現:地區隔離 + 月份均勻分佈