SHOW VARIABLES LIKE '%partition%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+
YES 表示支持。
SHOW PLUGINS; +------------+----------+----------------+---------+--------+ | Name | Status | Type | Library | License| +------------+----------+----------------+---------+--------+ | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | +------------+----------+----------------+---------+--------+
存在 partition ACTIVE STORAGE ENGINE 即支持。
MySQL 數據以文件形式存儲於 datadir(默認 /var/lib/mysql):
.frm:表結構定義.ibd (InnoDB) / .MYD (MyISAM):數據文件.MYI (MyISAM):索引文件分區本質:將單表的上述文件**物理拆分為多個小片段**,每個分區獨立存儲,邏輯上仍為一張表。
定義:按行數據劃分,每個分區包含完整列結構,僅行數不同。
-- 範圍分區:按年份劃分訂單表
CREATE TABLE orders (
id INT NOT NULL,
order_date DATE NOT NULL,
amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
優勢:
WHERE order_date > '2022-01-01' 僅掃描 p2022/pmaxALTER TABLE orders DROP PARTITION p2020 秒級清理歷史數據定義:將寬表拆分為多個窄表,共享主鍵,按業務訪問頻度分離。
-- 原寬表
CREATE TABLE user_profile (
user_id BIGINT PRIMARY KEY,
username VARCHAR(32),
email VARCHAR(64),
bio TEXT, -- 大字段,低頻訪問
avatar BLOB, -- 二進制大對象
settings JSON, -- 配置信息
created_at DATETIME
);
-- 縱向拆分
CREATE TABLE user_core (
user_id BIGINT PRIMARY KEY,
username VARCHAR(32),
email VARCHAR(64),
created_at DATETIME
);
CREATE TABLE user_extended (
user_id BIGINT PRIMARY KEY,
bio TEXT,
avatar BLOB,
settings JSON,
FOREIGN KEY (user_id) REFERENCES user_core(user_id)
);
優勢:
SELECT * 讀取無關數據| 類型 | 適用場景 | 分區鍵要求 | 典型案例 |
|---|---|---|---|
| RANGE | 時間序列、數值區間 | 整數/日期表達式 | 訂單按月/年分區 |
| LIST | 枚舉值離散分佈 | 整數列表 | 地區/狀態碼分區 |
| HASH | 均勻分佈、無明顯範圍 | 整數表達式 | 用戶 ID 取模分區 |
| KEY | 非整數主鍵、自動哈希 | 任意列(含字符串) | UUID 主鍵分區 |
| COLUMNS | 多列組合分區 | 多列元組 | (year, region) 雙維度 |
PRIMARY KEY (id, order_date)ALTER TABLE ... REORGANIZE PARTITION 會鎖表,大表用 pt-online-schema-change| 維度 | 分區 | 分表 | 分庫 |
|---|---|---|---|
| 透明度 | 完全透明(單表名) | 應用需路由 | 應用需路由 |
| 實現層級 | 存儲引擎層 | 應用/中間件層 | 架構層 |
| 跨節點 | 單實例 | 單實例/多實例 | 多實例集群 |
| 運維複雜度 | 低 | 中 | 高 |
| 擴展上限 | 單機磁盤/CPU | 單機/集群 | 無上限 |
分區是**單表內部的物理優化**,解決「大表查詢慢、歷史數據難清理、單磁盤瓶頸」;分表/分庫是**架構級水平擴展**,解決「寫入吞吐瓶頸、存儲容量無上限」。**先優化索引,再考慮分區,最後才是分表分庫**。