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

MySQL 分區總結:RANGE/LIST/HASH/KEY 四大類型與 COLUMNS/LINEAR 變體完整語法對比

     編輯:MySQL 綜合教學

MySQL 分區完整語法大全:四大類型與變體對比

一、RANGE 分區(范圍分區)

CREATE TABLE employees (
  id INT, fname VARCHAR(30), lname VARCHAR(30),
  hired DATE, separated DATE, job_code INT, store_id INT
) 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
);
  • 返回值**必須為整數**
  • MAXVALUE 可選,捕獲超出範圍數據
  • 類似 if ... elseif ... 邏輯

二、RANGE COLUMNS 分區(推薦用於日期/字符串)

CREATE TABLE rcx (
  a INT, b INT, c CHAR(3), d INT
) PARTITION BY RANGE COLUMNS(a,d,c) (
  PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
  PARTITION p1 VALUES LESS THAN (10,20,'mmmm'),
  PARTITION p2 VALUES LESS THAN (15,30,'sss'),
  PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
);
  • **不接受表達式,只能是列名**
  • 支援**多列**(元組比較)
  • 支援 DATE/DATETIME/STRING 類型列
  • 區間判斷可用 SELECT (5,10) < (5,12) 驗證

三、LIST 分區(列表分區)

CREATE TABLE employees (...) 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)
);
  • 返回值**必須為整數**
  • 適用於離散值分佈

四、LIST COLUMNS 分區

CREATE TABLE customers_1 (...) PARTITION BY LIST COLUMNS(renewal) (
  PARTITION pWeek_1 VALUES IN ('2010-02-01','2010-02-02',...),
  PARTITION pWeek_2 VALUES IN ('2010-02-08','2010-02-09',...),
  ...
);
  • 同 RANGE COLUMNS:無表達式、多列、支援日期/字符串
  • 多列示例:PARTITION BY LIST COLUMNS(city,last_name,first_name)

五、HASH 分區(哈希分區)

CREATE TABLE employees (...) PARTITION BY HASH(store_id) PARTITIONS 4;
  • 無需定義範圍,**僅指定分區數**
  • PARTITIONS 可省略 (默認 1),不可單寫不指定數值
  • 返回值**必須為整數**
  • 底層實現:MOD(expr, partitions)

六、LINEAR HASH 分區

CREATE TABLE employees (...) PARTITION BY LINEAR HASH(YEAR(hired)) PARTITIONS 4;
  • 算法不同:基於 2 的冪次擴展,**增/刪/合併分區更快** (TB 級優勢)
  • 缺點:數據分布**不均勻概率更大**

七、KEY 分區

-- 有主鍵/唯一鍵時可省略列
CREATE TABLE k1 (id INT PRIMARY KEY, name VARCHAR(20)) PARTITION BY KEY() PARTITIONS 2;

-- 無主鍵必須指定列
CREATE TABLE tm1 (s1 CHAR(32)) PARTITION BY KEY(s1) PARTITIONS 10;
  • 允許**多列**
  • 有主鍵/唯一鍵時默認用其列
  • 分區鍵**必須為列**,不可為表達式
  • 算法:基於列值 **MD5** 哈希

八、LINEAR KEY 分區

CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR KEY(col1) PARTITIONS 3;
  • 同 LINEAR HASH:分區管理快、分布較不均

九、核心限制總結

限制說明
主鍵/唯一鍵包含分區列若表有 PK/UK,**分區列必須包含在其中**
原生 RANGE/LIST/HASH 返回整數不可直接用 DATE/STRING,需函數轉換
COLUMNS/KEY 只能用列不可用表達式 (如 YEAR(date))
MAXVALUE / 分區數上限MySQL 8.0 最大 8192 個分區

十、選型速查表

場景推薦
時間範圍查詢、按天/月歸檔RANGE COLUMNS
業務枚舉值明確 (地區、狀態)LIST COLUMNS
寫入均勻分散、無範圍查詢HASH / KEY
TB 級大表、頻繁增刪分區LINEAR HASH / LINEAR KEY
需多列組合分區RANGE/LIST COLUMNS、KEY
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved