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

MySQL 分區表管理實戰(一):RANGE/LIST 分區增刪改與 REORGANIZE 進階重組

     編輯:MySQL 綜合教學

MySQL 分區表管理實戰(一):RANGE/LIST 分區增刪改與 REORGANIZE 進階重組

分區表上線後,業務增長必然面臨分區新增、刪除、合併、拆分等維護需求。本文聚焦 RANGE/LIST 分區,系統講解 DROP、TRUNCATE、ADD、REORGANIZE 核心操作與避坑指南。

範例基礎表

CREATE TABLE members (
    id INT,
    fname VARCHAR(25),
    lname VARCHAR(25),
    dob DATE
)
PARTITION BY RANGE( YEAR(dob) ) (
    PARTITION p0 VALUES LESS THAN (1970),
    PARTITION p1 VALUES LESS THAN (1980),
    PARTITION p2 VALUES LESS THAN (1990)
);

一、刪除分區

ALTER TABLE members DROP PARTITION p1;

影響:

  • 分區資料**永久丟失**,不可恢復
  • SHOW CREATE TABLE 不再顯示該分區定義

後續插入行為差異:

  • RANGE:原屬 p1 (1970-1980) 的資料自動路由至下一個分區 p2
  • LIST:原屬被刪分區的資料插入**直接報錯**,需先補齊分區定義

僅清空資料保留分區結構

ALTER TABLE members TRUNCATE PARTITION p1;

二、新增分區

ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000));

限制:ADD PARTITION **僅能在分區列表末尾新增**,本例中只能加在 1990 年之後。

三、REORGANIZE PARTITION — 靈活重組核心

突破「僅能尾部新增」限制,支援拆分、合併、區間調整。

1. 拆分分區:在 p0 前插入 1960 界限

ALTER TABLE members REORGANIZE PARTITION p0 INTO (
    PARTITION s0 VALUES LESS THAN (1960),
    PARTITION s1 VALUES LESS THAN (1970)
);

原 p0 (<1970) 拆為 s0 (<1960) + s1 (<1970)。

2. 合併分區:將 p0-p3 合併為兩大區間

ALTER TABLE members REORGANIZE PARTITION p0,p1,p2,p3 INTO (
    PARTITION m0 VALUES LESS THAN (1980),
    PARTITION m1 VALUES LESS THAN (2000)
);

四、REORGANIZE 核心限制

  1. 不能修改分區類型:如需從 RANGE 改為 HASH,必須用 ALTER TABLE ... PARTITION BY HASH(...) 重建表
  2. 新定義必須覆蓋舊範圍:partition_definitions 範圍並集必須包含 partition_list 所有值
  3. 語法:ALTER TABLE tbl REORGANIZE PARTITION partition_list INTO (partition_definitions);

五、HASH/KEY 分區管理差異

不支援 DROP/TRUNCATE/REORGANIZE 單個分區,僅支援整體數量調整:

-- 減少 4 個分區 (12→8)
ALTER TABLE clients COALESCE PARTITION 4;

-- 增加 6 個分區 (12→18)
ALTER TABLE clients ADD PARTITION PARTITIONS 6;

掌握 REORGANIZE,即可應對 90% 分區結構變更場景,避免大表重建停機風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved