本文將介紹YYYYWEEK函數的使用方式。

描述

根據分庫鍵時間值的年份與一年的周數計算哈希值,然后再按分庫數進行取余。

例如,YYYYWEEK('2012-12-31 12:12:12')等價于按照(2013x54+1)%D(D是分庫數目)公式計算出2012-12-31是2013年的第1周。

使用限制

  • 拆分鍵的類型必須是DATE、DATETIME或TIMESTAMP中的一種。
  • 使用YYYYWEEK函數前,需要先確定所需的總物理分表數,您可以通過確定循環周期(如2年)來確定總的物理分表數。因為YYYYWEEK函數僅支持為循環周期內的每一周創建一張獨立分表。
  • 當周數經過一個循環周期后(如2012年第1周經過一個2年的循環周期后是2014年第1周),相同周數有可能被路由到同一個分庫分表,具體被分到哪個分表受實際的分表數目影響。

使用場景

YYYYWEEK函數適用于需要按年份與一年的周數進行分庫的場景。建議結合該函數與tbpartition by YYYYWEEK(ShardKey)命令一起使用。

使用示例

假設PolarDB-X里已經擁有8個物理庫,現有如下需求:
  • 按年周進行分庫。
  • 同一周的數據都能落在同一張分表,且兩年以內的每一周都能單獨對應一張分表。
  • 查詢時帶上分庫分表鍵后能直接將查詢落在某個物理分庫的某個物理分表。

YYYYWEEK分庫函數即可滿足上述要求。上述需求中提到兩年以內的每一周都需對應一張分表(即一周一張表),由于一年最多有53周,所以需要創建106(53x2=106)張物理分表才能滿足上述需求。PolarDB-X已有8個分庫,所以每個分庫應該建14張物理分表(106/8=13.25,取整為14,分表數最好是分庫數的整數倍)。

則您可以使用如下建表DDL:
create table test_yyyyweek_tb (    
    id int, 
    name varchar(30) DEFAULT NULL,  
    create_time datetime DEFAULT NULL,
    primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
dbpartition by YYYYWEEK(create_time) 
tbpartition by YYYYWEEK(create_time) tbpartitions 14;