RIGHT_SHIFT は PolarDB-X 1.0 のシャーディング関数です。シャードキーの値を固定ビット数だけ右にシフトしてから剰余演算を適用することで、行をルーティングします。シャードキーの下位ビットがフラグやパディングであり、分散に影響を与えない場合に使用します。これらのビットをシフトで除外してから剰余を計算することで、シャード全体でより均等な分散が実現されます。
仕組み
RIGHT_SHIFT(shardKey, n) は、2 つのステップで行をルーティングします。
シャードキー値に対して符号付き右シフトを実行します:
shardKey >> n結果をデータベースシャードまたはテーブルシャードの数で除算し、その剰余を求めます:
(shardKey >> n) % shardCount
この剰余によって、行がどのシャードに格納されるかが決まります。
例: 4 つのデータベースシャードがあり、キーが 0x0100 の場合
RIGHT_SHIFT(0x0100, 8) = 0x01 = 1
1 % 4 = 1 -> shard 1同様のロジックで、0x0200、0x0300、0x0400 はそれぞれシャード 2、3、0 にマップされ、4 つの値が 4 つのシャードに分散されます。
RIGHT_SHIFT の使用シーン
RIGHT_SHIFT は、シャードキーの上位ビットが行ごとに異なる一方、下位ビットが固定されている場合に使用します。例えば、最下位ビットがステータスフラグ、バージョン番号、または型識別子をエンコードしている場合などです。
単純な剰余シャーディングでは、これらの固定された下位ビットが剰余計算を支配してしまい、多くの行が同じシャードに格納される可能性があります。固定ビットをシフトで除外することで、上位ビットが持つ分散の特性が復元されます。
パラメーター
| パラメーター | 型 | 説明 |
|---|---|---|
shardKey | 列リファレンス | シャードキー列。整数型である必要があります。 |
n | 整数 | 右にシフトするビット数。シャードキーのデータ型のビット幅 (例: INT の場合は 32) を超えることはできません。 |
注意事項
RIGHT_SHIFTが均等な分布を生成するのは、上位ビット (シフト後に残るビット) がシャードキーの値全体で十分にばらけている場合に限られます。残りのビットもクラスター化されていたり、連続していたりする場合、分布は依然として不均一になる可能性があります。DDL 文でビットシフト数を指定します。
このシフトは符号付き (算術) 右シフトであり、符号ビットは保持されます。
制限事項
シャードキーは整数列である必要があります。
PolarDB-X 1.0 インスタンスのバージョンが 5.1.28-1320920 以降である必要があります。
RIGHT_SHIFT を使用したテーブルのパーティション分割
次の例では、test_hash_tb を id 列でパーティション分割し、8 ビット右にシフトします。テーブルは、データベースシャードごとに 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 RIGHT_SHIFT(id, 8)
tbpartition BY RIGHT_SHIFT(id, 8) tbpartitions 4;プレースホルダーの値を置き換えます:
| プレースホルダー | 説明 | 例 |
|---|---|---|
id | シャードキー列 — 整数型である必要があります | user_id、order_id |
8 | 右にシフトするビット数 — キー値の固定された下位ビット数に合わせて調整します | 4、8、16 |
4 | データベースシャードあたりのテーブルシャード数 | 4、8 |