このトピックでは、ルーティング式の形式と、論理テーブルのルーティングアルゴリズムを設定する方法について説明します。
背景情報
論理テーブルのルーティングアルゴリズムを設定して、ルーティングフィールドに基づいて論理テーブルと一致する特定の物理テーブルのデータを効率的にクエリできます。 この方法では、手動計算を実行したり、物理テーブルを切り替えたりする必要はありません。 これにより、ルーティングのオーバーヘッドが低減される。
詳細については、「ルーティングアルゴリズム」をご参照ください。
シナリオ
- テーブルシャードのデータを照会します。
- テーブルシャードのデータを変更します。
- テーブルシャードのデータをエクスポートします。
式の形式
データ管理 (DMS) では、Groovy式を使用してテーブルシャードをクエリするためのルーティングアルゴリズムを定義できます。 ルーティング式の形式は、アプリケーションコードで使用される形式と似ています。
ルーティングフィールドは、#
ルーティングフィールド#
の形式で指定できます。 例: #shardKey#
。
手順
以下の例では、ルーティングアルゴリズムは、単純なモジュロ演算を実行するように構成される。
論理データベースに論理テーブルを作成します。 詳細については、「論理テーブル」をご参照ください。
論理テーブルを設定したら、[グローバル検索] ページで論理データベースを見つけます。 次に、[操作] 列の [クエリ] をクリックして、[SQLコンソール] ページに移動します。
説明上部のナビゲーションバーで
を選択することもできます。 次に、ドロップダウンリストから論理データベースを選択して、[SQLコンソール] ページに移動します。表示されるページの右上隅にあるアイコンをクリックして、テーブルリストページに移動します。
作成した論理テーブルを見つけます。 次に、[ルーティングアルゴリズム] 列の [アルゴリズムの設定] をクリックします。
表示されるページで、[作成] をクリックします。 [アルゴリズムの作成] ダイアログボックスで、[アルゴリズムの種類] 、[モジュロ演算] 、[テーブルパーティショニングフィールド] 、および [モジュラス] パラメーターを設定します。
この例では、Modulo Operation on One Columnがアルゴリズムタイプとして選択され、Simple Modulo OperationがModulo Operationとして選択され、idがTable Partitioning Fieldとして選択され、Modulusパラメータが4に設定される。 ルーティングアルゴリズムの式は
#id#% 4
です。説明単純なモジュロ演算は、数値フィールドに対してのみ実行できます。
数値フィールドと文字列フィールドの両方でモジュラハッシュ演算を実行できます。
[保存] をクリックします。
ルーティングアルゴリズムの設定後、論理テーブルのデータを照会し、INSERTステートメントを実行します。 システムは、ルーティングアルゴリズムを使用して計算された結果に基づいて、対応するテーブルシャードにデータを挿入します。
たとえば、ID列の値が9のデータ行を挿入すると、ルーティング結果は1になり、そのデータ行は名前がlogic_table_01のテーブルシャードに挿入されます。
サンプルルーティング式
次のルーティング式のサンプルでは、user_id
は論理テーブルのフィールドです。
テーブルシャーディングに基づくルーティング
単純なモジュロ演算
数値フィールドのモジュロ演算:
#user_id#% 100
2次モジュロ演算:
#user_id#% 10000% 100
数値フィールドのJavaハッシュコードに対するモジュロ演算:
Math.abs(#user_id#.hashCode())% 100
文字列フィールドのモジュロ演算
数値文字列ハッシュ:
Math.abs(#user_id#.toString().hashCode())% 100
文字列ハッシュ:
Math.abs(#user_id#.hashCode())% 100
CobarHash:
Math.abs(cobarHash(#column#,start, end)).intdiv (8)
CobarOldHash:
Math.abs(cobarOldHash(#column#, len)).intdiv (8)
データベースシャーディングに基づくルーティング
異なるデータベース内の同じ名前のテーブルにデータをルーティングします。
'schema_prefix_'+(#user_id#% 10)+'.table_name '
指定されたデータベースとテーブルにデータをルーティングする
'schema_prefix_'+(#user_id#% 100)+'.table_name_prefix_'+(#user_id#% 1000)
各データベースシャードの同じテーブルシャードにデータをルーティングする:
'schema_prefix_'+ lastSwapZero(String.valueOf((#user_id#% 1024).intdiv(128) 、4)+'.table_name_prefix_'+ lastSwapZero(String.valueOf((#user_id#% 128))) 、4)
EXTEND_IDフィールドの16文字目と7文字目で構成される整数を2で割って名前が決定されるデータベースと、EXTEND_IDフィールドの16文字目と7文字目で構成される整数で名前が決定されるテーブルにデータをルーティングします。
'schema_prefix_'+ 部分文字列 (#EXTEND_ID# 、16,18).toLong().intdiv(2)+'.table_name_prefix_'+ 部分文字列 (#EXTEND_ID# 、16,18)
日付に基づくルーティング
毎月同じ日にデータを同じテーブルにルーティングします。
dayOfMonth(#time#)
文字列フィールドの最後から3番目の文字に基づくルーティング
Integer.valueOf(substring(#ip_id#,-3,-2))* 10
: テーブル名のインデックス値が10増加した場合、ip_idフィールドの最後から3番目の文字から変換された整数に10を掛けます。 テーブル名のインデックス値が1増加した場合、ip_idフィールドの最後から3番目の文字から変換された整数は10倍されません。その他の複雑なルーティング方法
ユーザー定義関数 (UDF) を使用してデータをルーティングする:
String func(String arg){ return arg.hashCode()%10;} 'table_name_'+func(#user_id#)+'_other_'func(#user_id#)
説明関数と式の間に改行を使用する必要があります。
DMSは
CRC32(java.util.zip.CRC32)
関数ルーティングをサポートしています。
一般的な組み込み関数
cobarOldHash
cobarHash
weekOfYear
dayOfYear
dayOfMonth
dayOfWeek
部分文字列
last4swap
lastSwapZero