このトピックでは、YYYYDD関数の使用方法について説明します。
制限事項
- シャードキーは、DATE、DATETIME、またはTIMESTAMPタイプである必要があります。
- YYYYDD関数を使用する前に、特定のサイクル (2年など) に基づいて必要な物理テーブルシャードの総数を決定します。 YYYYDD関数を使用すると、サイクル内の各日に1つのテーブルシャードのみを作成できます。
- 次のサイクルで日付が繰り返されると、その日付で生成されたデータは、最後のサイクルの同じ日付で生成されたデータを格納する同じテーブルシャードにルーティングされます。 たとえば、2012年3月1日から始まる2年間のサイクルを指定した場合、3月1日に生成されたデータ、2014次のサイクルで生成されたデータは、2012年3月1日に生成されたデータを格納する同じテーブルシャードにルーティングされる可能性があります。 データのルーティング先のテーブルシャードは、テーブルシャードの数によって異なります。
- PolarDB-X 1.0インスタンスのバージョンは5.1.28-1320920以降である必要があります。
ルーティング方法
YYYYDD関数を使用して、データベースシャードキーの時間値の年と日に基づいてハッシュ値を計算できます。 次に、ハッシュ値をデータベースシャードの数で割り、剰余を取得します。 その結果、データは剰余に基づいて分割される。
たとえば、YYYYDD関数のパラメーターをYYYYDD('2012-12-31 12:12:12 ')
形式で指定した場合、剰余は次の式に基づいて計算されます。(2012x366 + 366)% D
。 計算結果は、2012年12月31日が2012年の366日目であることを示す。
シナリオ
YYYYDD関数は、データを年と日ごとにデータベースシャードに分割する必要があるシナリオに適しています。 この関数は、tbpartition by YYYYDD(ShardKey)
で使用することを推奨します。
例:
この例では、PolarDB-X 1.0インスタンスに2つのノードがあります。 デフォルトでは、各ノードに8つのデータベースシャードがあります。 データは、次の要件に基づいて分割する必要があります。
- データは、年と日ごとにデータベースシャードに分割されます。
- 同じ日に生成されたデータは、同じテーブルシャードに分割されます。 2年以内の毎日は、独立したテーブルシャードに対応します。
- シャードキーがクエリで指定されている場合、クエリはデータベースシャードの特定の物理テーブルシャードに直接配布されます。
YYYYDD関数は、前述の要件を満たすことができます。 2年以内の毎日がテーブルシャードに対応する必要があります。 したがって、1年は最大366日であるため、合計732 (366x2) の物理テーブルシャードを作成する必要があります。 PolarDB-X 1.0インスタンスには16個のデータベースシャードがあります。 各データベースシャードの物理テーブルシャードの数は、次の2つのステップで計算されます。 作成する必要がある物理テーブルシャードの総数をデータベースシャードの数で割ります。 2. 結果を次に近い整数まで丸めます。 この場合、物理テーブルシャードの数は46で、これは45.75 (732/16) に最も近い整数です。 テーブルシャードの数は、データベースシャードの数の整数倍にすることをお勧めします。
次のデータ定義言語 (DDL) ステートメントを使用して、テーブルを作成できます。
テーブルtest_yyyydd_tbを作成する (
id int,
名前varchar(30) DEFAULT NULL、
create_time datetime DEFAULT NULL、
主キー (id)
) エンジン=InnoDBデフォルト料金=utf8
YYYYDD(create_time) によるdbpartition
tbpartition by YYDD(create_time) tbpartitions 46;