このトピックでは、UNI_HASHの使用方法について説明します。
考慮事項
UNI_HASH関数は、単純なモジュロ演算を実行する。 ハッシュ出力は、シャーディング列の値が均等に分散されている場合にのみ均等に分散できます。
制限事項
- シャードキーのデータ型は、整数または文字列である必要があります。
- PolarDB-X 1.0インスタンスのバージョンは5.1.28-1508068以降である必要があります。
ルーティング方法
UNI_HASHは、次のシナリオで使用されます。
- UNI_HASH関数を実行してデータベースシャーディングを実行すると、データベースシャードキーの値がデータベースシャードの数で除算され、剰余が取得されます。 キー値が文字列の場合、文字列はハッシュ値に変換されます。 そして、ハッシュ値が計算され、ルート計算が完了する。 例えば、
HASH('8')
は、8% D
に相当する。文字Dは、データベースシャードの数を示す。 - UNI_HASH関数を実行して、同じシャードキーを使用してデータベースシャーディングとテーブルシャーディングを実装するとします。 データベースシャードキーの値をデータベースシャードの数で割って、残りを取得します。 その後、データはデータベースシャードの各テーブルシャードに均等にルーティングされます。
シナリオ
- データベースシャーディングは、ユーザーIDまたは注文IDに基づいて実装されます。
- シャードキーのデータ型は整数または文字列です。
- 同じシャードキーを使用して、2つの論理テーブルに対してデータベースシャーディングを実装する必要があります。 1つのテーブルのテーブルシャードの数は、他のテーブルのテーブルシャードの数と異なります。 2つのテーブルは、シャードキーを使用して結合されることがよくあります。
ユースケース
UNI_HASH関数を実行して、ID列の値を使用してシャーディングを実装する必要があり、各データベースシャードに4つのテーブルが含まれているとします。 次のデータ定義言語 (DDL) ステートメントを実行して、テーブルを作成できます。
テーブルtest_hash_tbを作成する (
id int,
名前varchar(30) DEFAULT NULL、
create_time datetime DEFAULT NULL、
主キー (id)
) エンジン=InnoDBデフォルト料金=utf8
UNI_HASH(ID) によるdbpartition
tbpartition by UNI_HASH(ID) tbpartitions 4;
HASHとの比較
比較シナリオ | UNI_ハッシュ | ハッシュ |
データベースシャーディングは実装され、テーブルシャーディングは実装されません。 | 2つの機能は同じルーティング方法を使用します。 このメソッドでは、データベースシャードキーの値をデータベースシャードの数で割って、剰余を取得します。 | |
シャーディングは、同じシャードキーを使用して実装されます。 | 同じキー値を使用してデータベースシャードにルーティングされる結果は、テーブルシャードの数が変化しても変化しません。 | テーブルシャードの数の変更と同じキー値の変更を使用してデータベースシャードにルーティングされる結果。 |
シャーディングは、同じシャードキーを使用して2つの論理テーブルに実装する必要があります。 ただし、1つの論理テーブルのテーブルシャードの数は、他の論理テーブルのテーブルシャードの数と異なります。 | シャードキーを使用して一方のテーブルをもう一方のテーブルに結合すると、データベース間の結合は発生しません。 | シャードキーを使用して一方のテーブルをもう一方のテーブルに結合すると、データベース間の結合が発生します。 |