2 つの論理テーブルが同じシャードキーを共有しているが、テーブルシャーディング数が異なる場合、標準の HASH 関数はテーブルシャーディング数の変更に伴い、データベースシャードへのルーティングが変化します。そのため、シャードキーでこれらのテーブルを結合すると、コストのかかるクロスデータベース結合が発生します。UNI_HASH は、テーブルシャーディング数の変更に関わらずデータベースシャードへのルーティングを安定的に保つことで、この問題を解決します。その結果、シャードキーによる結合操作は常に単一のデータベースシャード内で完結します。
UNI_HASH は、シャードキーの値自体が均等に分布している場合にのみ、均等なディストリビューションを実現します。
制限事項
シャードキーのデータの型は、整数または文字列である必要があります。
PolarDB-X 1.0 インスタンスのバージョンが 5.1.28-1508068 以降である必要があります。
ルーティングの仕組み
UNI_HASH は、シャードキーに対して剰余演算を実行してデータをルーティングします。
整数キーの場合:キー値をデータベースシャード数で除算し、その剰余に基づいて対象のデータベースシャードを決定します。
文字列キーの場合:まず文字列をハッシュ値に変換し、その後同様の剰余演算を適用します。たとえば、
HASH('8')は、8 % D(D はデータベースシャード数)と同等です。
データベースシャーディングとテーブルシャーディングの両方に同じシャードキーを使用する場合、UNI_HASH はまずデータベースシャードを決定し、その後そのデータベースシャード内のテーブルシャードにデータを均等に分散します。
重要なプロパティ:特定のシャードキー値に対して、テーブルシャーディング数が変化しても対象のデータベースシャードは変化しません。この安定性が、UNI_HASH を HASH と区別する特徴です。
利用シーン
UNI_HASH は以下のケースに適しています。
ユーザー ID や注文 ID によるシャーディング:これらは一般的に整数または文字列のキーであり、値の分布が広範囲にわたることが多いです。
テーブルシャーディング数が異なるテーブル間の結合:2 つの論理テーブルが同じシャードキーを共有しているがテーブルシャーディング数が異なる場合、UNI_HASH は任意のキー値に対して常に両方のテーブルを同一のデータベースシャードにルーティングします。そのため、シャードキーによる結合は単一のデータベースシャード内で完結し、クロスデータベース結合を回避できます。
シャーディングテーブルの作成
次のデータ定義言語 (DDL) 文は、id 列を UNI_HASH でシャーディングし、各データベースシャードあたり 4 つのテーブルシャードを持つテーブルを作成します。
create table test_hash_tb (
id int,
name varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by UNI_HASH(ID)
tbpartition by UNI_HASH(ID) tbpartitions 4;UNI_HASH と HASH の比較
| シナリオ | UNI_HASH | HASH |
|---|---|---|
| データベースシャーディングのみ(テーブルシャーディングなし) | キー値 % データベースシャード数 でルーティングします。 | 動作は同一です。 |
| データベースおよびテーブルシャーディングで同じシャードキーを使用 | データベースシャードへのルーティングは 安定的 — テーブルシャーディング数が変化しても結果は変わりません。 | データベースシャードへのルーティングは、テーブルシャーディング数の変化に応じて 変化 します。 |
| 2 つの論理テーブルが同じシャードキーを共有しているが、テーブルシャーディング数が異なる | シャードキーによる結合は単一のデータベースシャード内で完結 — クロスデータベース結合は発生しません。 | シャードキーによる結合が複数のデータベースシャードにまたがる可能性あり — クロスデータベース結合が発生 します。 |
以下の両方が該当する場合は、HASH よりも UNI_HASH を選択してください。
データベースシャーディングとテーブルシャーディングに同じシャードキーを使用している。
2 つ以上の論理テーブルが同じシャードキーを共有しており、かつテーブルシャーディング数が異なり、それらのテーブルを頻繁にシャードキーで結合する必要がある。