すべてのプロダクト
Search
ドキュメントセンター

PolarDB:UNI_HASH

最終更新日:Mar 29, 2026

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_HASHHASH
データベースシャーディングのみ(テーブルシャーディングなし)キー値 % データベースシャード数 でルーティングします。動作は同一です。
データベースおよびテーブルシャーディングで同じシャードキーを使用データベースシャードへのルーティングは 安定的 — テーブルシャーディング数が変化しても結果は変わりません。データベースシャードへのルーティングは、テーブルシャーディング数の変化に応じて 変化 します。
2 つの論理テーブルが同じシャードキーを共有しているが、テーブルシャーディング数が異なるシャードキーによる結合は単一のデータベースシャード内で完結 — クロスデータベース結合は発生しませんシャードキーによる結合が複数のデータベースシャードにまたがる可能性あり — クロスデータベース結合が発生 します。

以下の両方が該当する場合は、HASH よりも UNI_HASH を選択してください。

  • データベースシャーディングとテーブルシャーディングに同じシャードキーを使用している。

  • 2 つ以上の論理テーブルが同じシャードキーを共有しており、かつテーブルシャーディング数が異なり、それらのテーブルを頻繁にシャードキーで結合する必要がある。