275
阿裏雲
分區管理__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲
分區管理主要是指添加、刪除、重新定義、合並或拆分已經存在的分區。所有這些操作都可以通過使用 ALTER TABLE 命令的分區擴展來實現。
RANGE分區
刪除分區以及分區數據
語法
ALTER TABLE table_name DROP PARTITION partiton_name;
舉例
使用下麵的 CREATE TABLE 和 INSERT 語句創建了一個按照 RANGE 分區的表,並且已經插入了 10 條記錄:
mysql> CREATE TABLE tr (id INT, name VARCHAR(50), purchased DATE)
-> PARTITION BY RANGE(YEAR(purchased))
-> (
-> PARTITION p0 VALUES LESS THAN (1990),
-> PARTITION p1 VALUES LESS THAN (1995),
-> PARTITION p2 VALUES LESS THAN (2000),
-> PARTITION p3 VALUES LESS THAN (2005)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO tr VALUES
-> (1, 'desk organiser', '2003-10-15'),
-> (2, 'CD player', '1993-11-05'),
-> (3, 'TV set', '1996-03-10'),
-> (4, 'bookcase', '1982-01-10'),
-> (5, 'exercise bike', '2004-05-09'),
-> (6, 'sofa', '1987-06-05'),
-> (7, 'popcorn maker', '2001-11-22'),
-> (8, 'aquarium', '1992-08-04'),
-> (9, 'study desk', '1984-09-16'),
-> (10, 'lava lamp', '1998-12-25');
Query OK, 10 rows affected (0.01 sec)
可以通過使用下麵的命令查看那些記錄已經插入到了分區 p2 中:
mysql> SELECT * FROM tr
-> WHERE purchased BETWEEN '1995-01-01' AND '1999-12-31';
+------+-----------+------------+
| id | name | purchased |
+------+-----------+------------+
| 3 | TV set | 1996-03-10 |
| 10 | lava lamp | 1998-12-25 |
+------+-----------+------------+
2 rows in set (0.00 sec)
要刪除名字為 p2 的分區,執行下麵的命令:
mysql> ALTER TABLE tr DROP PARTITION p2;
Query OK, 0 rows affected (0.03 sec)
記住下麵一點非常重要:當刪除了一個分區,也同時刪除了該分區中所有的數據。可以通過重新運行前麵的 SELECT 查詢來驗證這一點:
mysql> SELECT * FROM tr WHERE purchased
-> BETWEEN '1995-01-01' AND '1999-12-31';
Empty set (0.00 sec)
刪除數據:保留表的結構,包括分區
語法
TRUNCATE TABLE table_name
舉例
接上麵的例子,刪除 tr 表的所有內部。
mysql> TRUNCATE TABLE tr;
Query OK, 0 rows affected (0.25 sec)
查看表的內容為空
mysql> select * from tr;
Empty set (0.00 sec)
查看表的數據結構
mysql> show create table tr;
+-------+------------------------------------------------------------
| Table | Create Table
+-------+------------------------------------------------------------
| tr | CREATE TABLE `tr` (
`id` int(11) DEFAULT NULL,
`name` VARCHAR(50) DEFAULT NULL,
`purchased` date DEFAULT NULL
)
/*!50100 PARTITION BY RANGE (YEAR(purchased))
(PARTITION p0 VALUES LESS THAN (1990) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (1995) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (2005) ENGINE = InnoDB) */ |
+-------+------------------------------------------------------------
1 row in set (0.00 sec)
添加分區:為已經分區的表添加後續分區
語法
ALTER TABLE ... ADD PARTITION
舉例
例如,假設有一個包含你所在組織的全體成員數據的分區表,該表的定義如下:
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)
);
進一步假設成員的最小年紀是 16 歲。隨著日曆接近 2005 年年底,你會認識到不久將要接納 1990 年(以及以後年份)出生的成員。可以按照下麵的方式,修改成員表來容納出生在 1990-1999 年之間的成員:
ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000));
約束
對於通過 RANGE 分區的表,隻可以使用 ADD PARTITION 添加新的分區到分區列表的高端。設法通過這種方式在現有分區的前麵或之間增加一個新的分區,將會導致下麵的一個錯誤:
mysql> ALTER TABLE members ADD PARTITION (PARTITION p4 VALUES LESS THAN (1960));
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition
分區擴展
分區可以通過 REOGANIZE PARTITION 來實現拆分或合並分區等。
語法
ALTER TABLE tblname REORGANIZE PARTITION partition_list INTO (partition_definitions);
其中,tbl_name 是分區表的名稱,partition_list 是通過逗號分開的、一個或多個將要被改變的現有分區的列表。partition_definitions 是一個是通過逗號分開的、新分區定義的列表,它遵循與用在“CREATE TABLE”中的 partition_definitions相同的規則。把多少個分區合並到一個分區或把一個分區拆分成多少個分區方麵,沒有限製。
舉例
mysql> show create table members;
+---------+----------------------------------------------------------
| Table | Create Table
+---------+----------------------------------------------------------
| members | CREATE TABLE `members` (
`id` int(11) DEFAULT NULL,
`fname` VARCHAR(25) DEFAULT NULL,
`lname` VARCHAR(25) DEFAULT NULL,
`dob` date DEFAULT NULL
)
/*!50100 PARTITION BY RANGE (YEAR(dob))
(PARTITION p0 VALUES LESS THAN (1970),
PARTITION p1 VALUES LESS THAN (1980),
PARTITION p2 VALUES LESS THAN (1990),
PARTITION p3 VALUES LESS THAN (2000) */ |
+---------+----------------------------------------------------------
1 row in set (0.01 sec)
假定想要把表示出生在 1960 年前成員的所有行移入到一個分開的分區中。正如我們前麵看到的,不能通過使用“ALTER TABLE ... ADD PARTITION”來實現這一點。但是,要實現這一點,可以使用 ALTER TABLE 上的另外一個與分區有關的擴展,具體實現如下:
mysql> ALTER TABLE members REORGANIZE PARTITION p0 INTO (
-> PARTITION s0 VALUES LESS THAN (1960),
-> PARTITION s1 VALUES LESS THAN (1970)
-> );
Query OK, 0 rows affected (0.53 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table members; //查看結果
+---------+----------------------------------------------------------
| Table | Create Table
+---------+----------------------------------------------------------
| members | CREATE TABLE `members` (
`id` int(11) DEFAULT NULL,
`fname` VARCHAR(25) DEFAULT NULL,
`lname` VARCHAR(25) DEFAULT NULL,
`dob` date DEFAULT NULL
)
/*!50100 PARTITION BY RANGE (YEAR(dob))
(PARTITION s0 VALUES LESS THAN (1960),
PARTITION s1 VALUES LESS THAN (1970),
PARTITION p1 VALUES LESS THAN (1980),
PARTITION p2 VALUES LESS THAN (1990),
PARTITION p3 VALUES LESS THAN (2000) */ |
+---------+----------------------------------------------------------
1 row in set (0.02 sec)
可以重新組織成員表的五個分區成兩個分區,具體實現如下:
mysql> ALTER TABLE members REORGANIZE PARTITION s0,s1,p1,p2,p3 INTO (
-> PARTITION m0 VALUES LESS THAN (1980),
-> PARTITION m1 VALUES LESS THAN (2000));
Query OK, 0 rows affected (0.73 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table members; //查看結果
+---------+----------------------------------------------------------
| Table | Create Table
+---------+----------------------------------------------------------
| members | CREATE TABLE `members` (
`id` int(11) DEFAULT NULL,
`fname` VARCHAR(25) DEFAULT NULL,
`lname` VARCHAR(25) DEFAULT NULL,
`dob` date DEFAULT NULL
)
/*!50100 PARTITION BY RANGE (YEAR(dob))
(PARTITION m0 VALUES LESS THAN (1980) ENGINE = InnoDB,
PARTITION m1 VALUES LESS THAN (2000) ENGINE = InnoDB) */ |
+---------+----------------------------------------------------------
1 row in set (0.01 sec)
HASH分區
合並分區
語法
ALTER TABLE ... COALESCE PARTITION
舉例
例如,假定有一個包含顧客信息數據的表,它被分成了 12 個分區。該顧客表的定義如下:
CREATE TABLE clients (
id INT,
fname VARCHAR(30),
lname VARCHAR(30),
signed DATE
)
PARTITION BY HASH( MONTH(signed) )
PARTITIONS 12;
要減少分區的數量從 12 到 6,執行下麵的 ALTER TABLE 命令:
mysql> ALTER TABLE clients COALESCE PARTITION 6;
Query OK, 0 rows affected (0.02 sec)
約束
COALESCE 不能用來增加分區的數量,如果你嚐試這麼做,結果會出現類似於下麵的錯誤:
mysql> ALTER TABLE clients COALESCE PARTITION 18;
ERROR 1508 (HY000): Cannot remove all partitions, use DROP TABLE instead
增加分區
語法
ALTER TABLE ... ADD PARTITION
舉例
在表 clients 中,把原有 6 個分區,增加 18 個分區,更新為 24 個分區。
mysql> alter table clients add partition partitions 18;
Query OK, 0 rows affected (3.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table clients; //查看結果
+----------+---------------------------------------------------------|
|Table | Create Table
+----------+---------------------------------------------------------|
clients2 | CREATE TABLE `clients` (
`id` int(11) DEFAULT NULL,
`fname` VARCHAR(30) DEFAULT NULL,
`lname` VARCHAR(30) DEFAULT NULL,
`signed` date DEFAULT NULL
) /*!50100 PARTITION BY HASH ( MONTH(signed))
PARTITIONS 24 */ |
+----------+---------------------------------------------------------1
row in set (0.00 sec)
注釋:“ALTER TABLE ... REORGANIZE PARTITION”不能用於按照HASH或HASH分區的表。
最後更新:2016-11-24 11:23:47
上一篇:
NULL值處理__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲
下一篇:
數值類型__數據類型_SQL語法參考_雲數據庫 OceanBase-阿裏雲
圖片鑒黃異步檢測結果查詢接口__智能圖片鑒黃API_內容檢測API文檔_阿裏綠網-阿裏雲
搜索相關性函數__應用高級配置_產品使用手冊_開放搜索-阿裏雲
數據轉發到RDS中__規則引擎_控製台使用手冊_阿裏雲物聯網套件-阿裏雲
安全服務__快速入門(開放API)_API 網關-阿裏雲
阿裏雲與芯訊通SIMCom——互聯網生態與垂直行業的深度融合
Presto 使用說明__開源組件介紹_用戶指南_E-MapReduce-阿裏雲
配置 IDEA 開發環境__開發工具準備_開發者指南_企業級分布式應用服務 EDAS-阿裏雲
設置集群根域名__集群管理_用戶指南_容器服務-阿裏雲
域名增刪操作__使用手冊_HTTPDNS-阿裏雲
獲取 Region 列表__資源管理類 API_Open API 參考_企業級分布式應用服務 EDAS-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲