RANGE_HASH は、PolarDB-X 1.0 向けの複合キーによるパーティション分割関数です。データが 2 つのビジネスキーでシャーディングされるが、クエリ実行時にはそのうち 1 つのキーしか利用できない場合に使用します。
仕組み
RANGE_HASH(COL1, COL2, N) は、各レコードをシャードにルーティングする際に、パーティションキーの末尾 N 文字を抽出し、そのハッシュ値をデータベースシャード数で除算した余りを用います。
パラメーター リファレンス
| パラメーター | 型 | 説明 |
|---|---|---|
COL1 | 文字列または数値 | 主パーティションキー。クエリに含まれている場合は、優先的に選択されます。 |
COL2 | 文字列または数値 | 代替パーティションキー。クエリに COL1 が含まれていない場合に選択されます。 |
N | 整数 | ハッシュ計算に使用する末尾の文字数。両方のキーはいずれも少なくとも N 文字以上である必要があり、各行について、それぞれの末尾 N 文字が一致している必要があります。 |
ルーティング ロジック
クエリが到着すると、PolarDB-X 1.0 は以下の順序で利用可能なキーを選択します。
| クエリの提供内容 | ルーティングに使用されるキー |
|---|---|
COL1 のみ | COL1 — 末尾 N 文字のハッシュ値を計算 |
COL2 のみ | COL2 — 末尾 N 文字のハッシュ値を計算 |
COL1 と COL2 | COL1 — 末尾 N 文字のハッシュ値を計算 |
すべての場合において、ハッシュ値をシャード数で除算した余りが、対象となるシャードを決定します。
制限事項
COL1とCOL2は、同一のデータの型(文字列または数値)である必要があります。テーブル作成後に、いずれかのパーティションキーを変更することはできません。
パーティションキーに対する範囲クエリはサポートされていません。
データ挿入時に、
N文字の末尾部分について、COL1とCOL2の値が一致している必要があります。文字列値は、少なくとも
N文字の長さである必要があります。PolarDB-X 1.0 のバージョン 5.1.28-1320920 以降が必要です。
例
以下のデータ定義言語 (DDL) 文は、8 個の物理データベースシャードを持つ PolarDB-X 1.0 クラスター内に注文テーブルを作成します。注文は buyer_id および order_id でシャーディングされますが、クエリではこれらの ID のいずれか 1 つだけが指定される可能性があります。
CREATE TABLE test_order_tb (
id INT,
buyer_id VARCHAR(30) DEFAULT NULL,
order_id VARCHAR(30) DEFAULT NULL,
create_time DATETIME DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition BY RANGE_HASH(buyer_id, order_id, 10)
tbpartition BY RANGE_HASH(buyer_id, order_id, 10) tbpartitions 3;N = 10 の場合、PolarDB-X 1.0 は、クエリで指定されたキーの末尾 10 文字からハッシュ値を計算します。挿入時に各ペアの末尾 10 文字が一致していれば、buyer_id をフィルター条件とするクエリと、order_id をフィルター条件とするクエリのいずれも、単一のシャードにルーティングされます。