本文將介紹YYYYDD函數的使用方式。
使用限制
- 拆分鍵的類型必須是DATE、DATETIME或TIMESTAMP中的一種。
- 使用YYYYDD函數前,需要先確定所需的總物理分表數,您可以通過確定重複持續時間(如2年)來確定總的物理分表數。因為YYYYDD函數僅支援為重複持續時間內的每一天建立一張獨立分表。
- 當日期經過一個重複持續時間後(如2012-03-01經過一個2年的重複持續時間後是2014-03-01),同一個日期有可能被路由到同一個分庫分表,具體被分到哪個分表受實際的分表數目影響。
- PolarDB-X 1.0執行個體的版本需為5.1.28-1320920或以上版本,。
路由方式
根據分庫鍵時間值的年份與一年的天數計算雜湊值,然後再按分庫數進行取餘,完成路由計算。
例如,YYYYDD('2012-12-31 12:12:12')函數等價於按照(2012x366+366)%D(D是分庫數目)公式計算出2012-12-31是2012年的第366天。
使用情境
YYYYDD函數適用於需要按年份與一年的天數進行分庫的情境。建議結合該函數與 tbpartition by YYYYDD(ShardKey)命令一起使用。
使用樣本
假設PolarDB-X 1.0裡已經擁有2個節點,每個節點預設有8個物理庫,現有如下需求:
- 按年天進行分庫。
- 同一天的資料都能落在同一張分表,且兩年以內的每一天都能單獨對應一張分表。
- 查詢時帶上分庫分表鍵後能直接將查詢落在某個物理分庫的某個物理分表。
YYYYDD分庫函數即可滿足上述要求。上述需求中提到兩年以內的每一天都需對應一張分表(即一天一張表),由於一年最多有366天,所以需要建立732(366x2=732)張物理分表才能滿足上述需求。PolarDB-X 1.0已有16個分庫,所以每個分庫應該建46張物理分表(732/16=45.75,取整為46,分表數最好是分庫數的整數倍)。
則您可以使用如下建表DDL:
create table test_yyyydd_tb (
id int,
name varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYDD(create_time)
tbpartition by YYYYDD(create_time) tbpartitions 46;