萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 分區表詳解(一):RANGE 分區原理、語法與典型應用場景

RANGE 分區核心概念

按**連續、不重疊的區間**劃分資料。每個分區定義 VALUES LESS THAN (值),順序遞增,類似 switch-case。區間上限**不包含**該值(嚴格小於)。

基本語法

CREATE TABLE employees (
  id INT NOT NULL,
  fname VARCHAR(30),
  lname VARCHAR(30),
  hired DATE NOT NULL DEFAULT '1970-01-01',
  separated DATE NOT NULL DEFAULT '9999-12-31',
  job_code INT NOT NULL,
  store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
  PARTITION p0 VALUES LESS THAN (6),
  PARTITION p1 VALUES LESS THAN (11),
  PARTITION p2 VALUES LESS THAN (16),
  PARTITION p3 VALUES LESS THAN (21)
);

店編 1-5 → p0,6-10 → p1,11-15 → p2,16-20 → p3。

邊界保護:MAXVALUE 捕獲溢出值

PARTITION BY RANGE (store_id) (
  PARTITION p0 VALUES LESS THAN (6),
  PARTITION p1 VALUES LESS THAN (11),
  PARTITION p2 VALUES LESS THAN (16),
  PARTITION p3 VALUES LESS THAN MAXVALUE  -- 存放 ≥16 所有值
);

未來擴充新店只需 ALTER TABLE ... REORGANIZE PARTITION 切分 p3。

多維度分區範例

按 job_code 範圍(業務編碼規則)

PARTITION BY RANGE (job_code) (
  PARTITION p0 VALUES LESS THAN (100),    -- 兩位數:店內工
  PARTITION p1 VALUES LESS THAN (1000),   -- 三位數:辦公/支援
  PARTITION p2 VALUES LESS THAN (10000)   -- 四位數:管理層
);

按日期函數表達式分區

PARTITION BY RANGE (YEAR(separated)) (
  PARTITION p0 VALUES LESS THAN (1991),
  PARTITION p1 VALUES LESS THAN (1996),
  PARTITION p2 VALUES LESS THAN (2001),
  PARTITION p3 VALUES LESS THAN MAXVALUE
);

離職年份 1991 前 → p0,1991-1995 → p1,2000 後 → p3。

分區表達式限制

  • 必須返回整數(或可隱式轉整數)。
  • 列需定義 NOT NULL,避免 NULL 無法比較導致插入失敗。
  • 可用函數:YEAR()、TO_DAYS()、TO_SECONDS()(5.5+)、UNIX_TIMESTAMP()(5.5+)等確定性函數。

RANGE 分區優勢場景

  1. 歷史資料快速歸檔/刪除:ALTER TABLE employees DROP PARTITION p0; 秒級釋放空間,避免 DELETE 全表掃描與碎片。
  2. 時間序列/遞增 ID 查詢:分區裁剪自動跳過無關分區,EXPLAIN PARTITIONS 可見 partitions=p2。
  3. 熱/冷資料分離存儲:各分區可指定 DATA DIRECTORY/INDEX DIRECTORY 掛載不同磁碟(SSD/HDD 分層)。

避坑指南

  • 插入值超出所有分區上限且無 MAXVALUE → ERROR 1526 (HY000): Table has no partition for value。
  • 分區鍵更新導致跨分區移動(UPDATE employees SET store_id=20 WHERE id=1),會觸發 DELETE + INSERT 開銷大,慎用。
  • 索引必須包含分區鍵才能全域唯一,否則唯一性僅在分區內保證。
copyright © 萬盛學電腦網 all rights reserved