YYYYMM は PolarDB-X 1.0 のパーティショニング関数であり、日付型カラムの年と月に基づいて、データをデータベースシャードとテーブルシャードに分散させます。
仕組み
YYYYMM は、パーティショニングキーの年と月からハッシュ値を計算し、モジュロ演算を使用してレコードをデータベースシャードに分散させます。
hash value = (year × 12 + month) % Dここで、D はデータベースシャードの数です。
例えば、YYYYMM('2012-12-31 12:12:12') は (2012 × 12 + 12) % D と評価され、レコードは 2012 年 12 月に対応するシャードにルーティングされます。
制限事項
パーティショニングキーは、
DATE型、DATETIME型、またはTIMESTAMP型である必要があります。テーブルを作成する前に、物理テーブルシャードの総数を決定する必要があります。この数は、周期 (例えば 2 年) に基づいて決定します。
YYYYMMは、周期内で 1 ヶ月あたり 1 つのテーブルシャードを割り当てます。周期が完了すると、月が再帰し、データは前の周期と同じシャードにルーティングされます。例えば、2012 年 3 月に開始する 2 年周期の場合、2014 年 3 月のデータは 2012 年 3 月のデータと同じテーブルシャードにルーティングされます。データがルーティングされる特定のテーブルシャードは、テーブルシャードの数に依存します。
PolarDB-X 1.0 バージョン 5.1.28-1320920 以降が必要です。
YYYYMM によるパーティションテーブルの作成
次の例では、2 年周期で 1 ヶ月あたり 1 つのテーブルシャードを持つテーブルを作成し、8 つのデータベースシャードに年と月でデータを分散させます。
シャード計画:
| 要素 | 値 | 計算 |
|---|---|---|
| サイクルの長さ | 2 年 | — |
| 必要なテーブルシャード数 | 24 | 12 ヶ月 × 2 年 |
| データベースシャード | 8 | — |
| データベースシャードあたりのテーブルシャード数 | 3 | 24 ÷ 8 |
tbpartitions 3 を使用して、データベースシャードごとに 3 つのテーブルシャードを作成します。
create table test_yyyymm_tb (
id int,
name varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYMM(create_time)
tbpartition by YYYYMM(create_time) tbpartitions 3;create_time でフィルターするクエリは、データベースシャード内のターゲットテーブルシャードに直接ルーティングされるため、フルテーブルスキャンを回避できます。
ユースケース
YYYYMM は、注文レコード、ログテーブル、課金データなど、レコードが暦月ごとに自然にグループ化されるデータセットに適しています。dbpartition by YYYYMM(ShardKey) と tbpartition by YYYYMM(ShardKey) を併用することで、データベースシャードとテーブルシャードの両方のレベルでデータを分散させ、月ベースのクエリで正確なシングルシャードルーティングを有効にできます。