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

MySQL 分區技術詳解:類型、原理與實戰應用

     編輯:MySQL 綜合教學

MySQL 分區概述

MySQL 分區是將一張大表根據特定的分區鍵(如範圍值、離散值列表、哈希函數值)劃分為多個較小的物理塊,每個分區獨立存儲數據與索引。這項技術將大對象拆解為小對象,能有效提升查詢性能、簡化數據維護,特別適合海量數據場景。

核心限制與規則

  • 整體性:分區作用於整張表的所有數據與索引,不可僅對數據或索引單獨分區,也不能僅對部分數據分區。
  • 本地索引:分區表上的索引必須是本地索引,即索引與數據同在一個分區內。
  • 分區鍵與主鍵/唯一鍵的關係:若表存在主鍵或唯一鍵,分區鍵必須包含在其中;不能使用主鍵/唯一鍵之外的字段進行分區。
  • 版本差異:MySQL 5.1 僅支持整數分區,RANGE、LIST、HASH 分區鍵必須為 INT 類型或返回 INT 的表達式;KEY 分區除 BLOB/TEXT 外支持其他類型。

四大主流分區類型深度解析

1. RANGE 分區(範圍分區)

基於連續區間將數據映射到不同分區,使用 VALUES LESS THAN 定義邊界。

CREATE TABLE range_test (
  id INT UNSIGNED,
  name VARCHAR(30) NOT NULL,
  age INT UNSIGNED NOT NULL,
  PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (id) (
  PARTITION p0 VALUES LESS THAN (10),
  PARTITION p1 VALUES LESS THAN (20),
  PARTITION p2 VALUES LESS THAN MAXVALUE
);

關鍵特性:

  • 分區定義須按順序遞增;
  • NULL 值視為最小值處理;
  • 適合定期清理過期數據(ALTER TABLE ... DROP PARTITION 秒級完成),及頻繁按分區鍵查詢的場景(分區剪枝提升效率)。

2. LIST 分區(列表分區)

基於枚舉值列表分區,使用 PARTITION BY LIST(expr) 配合 VALUES IN。

CREATE TABLE list_test (
  id INT UNSIGNED,
  name VARCHAR(30) NOT NULL,
  age INT UNSIGNED NOT NULL,
  PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY LIST (id) (
  PARTITION p0 VALUES IN (10, 5, 30),
  PARTITION p1 VALUES IN (20, 60, 70)
);

注意: 插入的值必須在列表中,否則報錯;NULL 必須顯式出現在某分區列表中。

3. HASH 分區(哈希分區)

根據指定分區數,通過哈希函數將數據均勻分散,主要用於消除熱點讀寫。

  • 常規 HASH:取模運算,增減分區需全量重分布,代價高;
  • 線性 HASH:基於 2 的冪次運算,分區維護極快,但數據分布相對不均勻。
CREATE TABLE hash_test (
  id INT UNSIGNED,
  name VARCHAR(30) NOT NULL,
  age INT UNSIGNED NOT NULL,
  PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY HASH (id) PARTITIONS 4;

4. KEY 分區(鍵值分區)

由 MySQL 內部哈希函數實現,支持除 BLOB/TEXT 外的所有類型,未指定分區鍵時默認使用主鍵,分區鍵不可為 NULL,大數據量下同樣能有效分散熱點。

CREATE TABLE key_test (
  id INT UNSIGNED,
  name VARCHAR(30) NOT NULL,
  age INT UNSIGNED NOT NULL,
  PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY KEY (id) PARTITIONS 4;

NULL 值在各分區類型中的處理差異

分區類型NULL 處理方式
RANGE視為最小值
HASH / KEY視為 0 值
LIST必須顯式列入值列表,否則報錯

最佳實踐建議

  1. 根據業務查詢模式選擇分區類型:時間序列用 RANGE,枚舉業務用 LIST,熱點分散用 HASH/KEY;
  2. 分區數不宜過多,通常建議不超過 1024 個;
  3. 善用 EXPLAIN PARTITIONS 驗證分區剪枝是否生效;
  4. 定期通過 ANALYZE TABLE 更新分區統計信息,確保優化器決策準確。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved