TDSQL MySQL版 目前支援 Range 和 List 兩種格式的二級分割槽,具體建表語法和 MySQL 分割槽語法類似。

二級分割槽語法

一級 Hash,二級 List 分割槽示例如下:

MySQL [test]> CREATE TABLE customers_1 (

first_name VARCHAR(25) key,

last_name VARCHAR(25),

street_1 VARCHAR(30),

street_2 VARCHAR(30),

city VARCHAR(15),

renewal DATE

) shardkey=first_name

PARTITION BY LIST (city) (

PARTITION pRegion_1 VALUES IN('Beijing', 'Tianjin', 'Shanghai'),

PARTITION pRegion_2 VALUES IN('Chongqing', 'Wulumuqi', 'Dalian'),

PARTITION pRegion_3 VALUES IN('Suzhou', 'Hangzhou', 'Xiamen'),

PARTITION pRegion_4 VALUES IN('Shenzhen', 'Guangzhou', 'Chengdu')

);

一級 Range,二級 List 建立語法如下:

MySQL [test]> CREATE TABLE tb_sub_r_l (

id int(11) NOT NULL,

order_id bigint NOT NULL,

PRIMARY KEY (id,order_id))

PARTITION BY list(order_id)

(PARTITION p0 VALUES in (2121122),

PARTITION p1 VALUES in (38937383))

TDSQL_DISTRIBUTED BY RANGE(id) (s1 values less than (100),s2 values less than (1000));

Query OK, 0 rows affected, 1 warning (0.35 sec)

Range 支援型別

DATE,DATETIME,TIMESTAMP。

支援 year,month,day 函式,函式為空和 day 函式一樣。

TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT。

支援 year,month,day 函式,此時傳入的值轉換為年月日,然後和分表資訊進行對比。

List 支援型別

DATE,DATETIME,TIMESTAMP。

支援年月日函式。

TINYINT, SMALLINT, MEDIUMINT, INT , BIGINT。

警告

建議不要使用 TIMESTAMP 型別作為分割槽鍵,因為 TIMESTAMP 受到時區的影響,同時只能使用到2038年。

如果分割槽鍵是 char 或者 varchar 型別,建議長度不超255。

使用場景和方法建議

建議業務儘量都使用一級分割槽表。

使用前根據業務長期場景合理設計表結構,二級分割槽適用於表結構建立後長期都不需要 DDL 變更、需要定期進行分割槽資料清理和裁剪的場景,如日誌流水錶。

合理設計二級分割槽的粒度,二級分割槽的粒度建議不要劃分得太細,避免產生過多的二級子表。如流水錶按月進行二級分割槽,而不是按天/小時進行分割槽,避免檔案系統上資料檔案個數過多。

在對二級分割槽表進行 SQL 查詢時,查詢條件需要儘量帶上一級分割槽和二級分割槽的鍵值,避免執行查詢時需要開啟很多的資料檔案進行搜尋。

在對二級分割槽表進行 join 查詢時,如果查詢條件未能帶上一級分割槽和二級分割槽的鍵值,操作效能效率較低,建議不要使用。

表的主鍵或唯一索引需要包含分割槽鍵,否則無法保證資料唯一性。