Interval Range分區是Range分區的擴展,在數據到達時自動創建間隔分區,不需要再手動創建新分區,方便了Range分區維護操作。
向RANGE分區表插入數據時,如果插入的數據超出當前已存在分區的范圍,將無法插入并且會返回錯誤;而對于INTERVAL RANGE分區表,當新插入的數據超過現有分區的范圍時,允許數據庫自動創建新分區,根據INTERVAL子句指定的范圍來新增分區。
如果分區范圍設置為1個月,新插入的數據為當前轉換點(當前存在的分區的最大邊界值)兩個月后的數據,將會創建該數據所在月份的分區,以及中間月份的分區。例如,您可以創建一個INTERVAL RANGE分區表,該表分區范圍為1個月且當前的轉換點為2021年9月15日。如果您嘗試為2021年12月10日插入數據,那么將創建2021年9月15日至12月15日所需的3個分區,并將數據插入該分區。
下列情況下建議您使用間隔分區:
數據按時間維度維護。
維護滾動的數據窗口。
不希望手動運維增加新的分區。
以下示例將orde_time
作為分區鍵,按間隔劃分sales
表。創建Interval Range分區表需要一個初始的轉換點,然后才能在轉換點之外自動創建新的分區。
在數據庫中創建一個新的Interval Range分區表,并向表中插入數據,示例如下:
CREATE TABLE sales
(
id BIGINT,
uid BIGINT,
order_time DATETIME
)
PARTITION BY RANGE COLUMNS(order_time) INTERVAL(MONTH, 1)
(
PARTITION p0 VALUES LESS THAN('2021-9-1')
);
在Interval Range分區表中插入數據,示例如下:
INSERT INTO sales VALUES(1, 1010101010, '2021-11-11');
插入數據后,通過SHOW CREATE TABLE
查詢sales
表定義。新的表定義如下:
CREATE TABLE `sales` (
`id` bigint(20) DEFAULT NULL,
`uid` bigint(20) DEFAULT NULL,
`order_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50500 PARTITION BY RANGE COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(MONTH, 1) */
/*!50500 (PARTITION p0 VALUES LESS THAN ('2021-9-1') ENGINE = InnoDB,
PARTITION _p20211001000000 VALUES LESS THAN ('2021-10-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20211101000000 VALUES LESS THAN ('2021-11-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20211201000000 VALUES LESS THAN ('2021-12-01 00:00:00') ENGINE = InnoDB) */
Interval Range分區自動新增加了_p20211001000000
、_p20211101000000
和_p20211201000000
三個分區。
_p作為前綴的分區名將會保留為系統命名規則,手動管理分區(創建新分區或者重命名分區的操作)時,將不允許使用此類型的分區名。例如,ADD PARTITION
和REORGANIZE PARTITION
操作將不允許使用‘_p’作為前綴的分區名;但是DROP PARTITION
操作可以使用‘_p’作為前綴的分區名。
在這樣的業務場景下,此前通常需要DBA在插入值觸及轉換點之前手動增加分區,但操作不當就有可能導致新的數據插入失敗。通過創建Interval Range分區表,可以由系統自動增加分區,避免數據不能及時插入的問題。
由于分區數量最多只能達到8192,自動增加分區的數量也會受限制,可以配合分區表的生命周期管理解決方案使用,定期增加分區,同時定期將冷數據所在的分區自動遷移到OSS上。