首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL LIST 分區完整指南:值列表映射、異構數據歸檔、子分區組合與 DROP PARTITION 秒級歸檔

     編輯:MySQL 綜合教學

核心機制

LIST 分區 根據列值是否屬於預定義的**離散值集合** 分配分區。與 RANGE 的連續區間不同,LIST 針對枚舉型、分類型業務:

  • 分區定義:`PARTITION BY LIST(expr)` + `VALUES IN (value_list)`
  • `expr` 必須返回整數 (MySQL 5.1 限制,8.0+ 支持字符串)。
  • 值列表無需有序,但不可重複、不可重疊。
  • **無 MAXVALUE 捕獲**:所有可能值必須顯式列出,否則 INSERT 報錯。

經典案例:門店地區歸檔

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);

INSERT 失敗場景與應對

-- store_id=21 不在任何分區值列表中
INSERT INTO employees VALUES (224, 'Linus', 'Torvalds', ..., 21);
-- ERROR 1526 (HY000): Table has no partition for value 21

解決方案:

  1. 預留 `PARTITION pOther VALUES IN (999, 888...)` 作為兜底,定期清理遷移。
  2. 應用層寫入前校驗,或使用觸發器攔截重定向。
  3. MySQL 8.0+ 可用 `PARTITION BY LIST COLUMNS(store_id)` 直接支持字符串,無需映射整數。

復合子分區組合

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)
);
-- 實現:地區隔離 + 月份均勻分佈

遷移建議

  • MySQL 5.7 及以下:LIST 分區僅支持整數,字符串需映射表或哈希函數轉整數。
  • MySQL 8.0+:**強烈推薦 `LIST COLUMNS`**,原生支持字符串、日期、多列,無需映射,語義更清晰。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved