SHARD_ROW_ID_BITS
このドキュメントでは、暗黙的に_tidb_rowidシャーディングされた後にシャードのビット数を設定するために使用されるSHARD_ROW_ID_BITSテーブル属性を紹介します。
コンセプト
クラスタ化されていないプライマリキーまたはプライマリキーのないテーブルの場合、TiDB は自動的に生成された_tidb_rowid暗黙の自動インクリメント行 ID として使用します。多数のINSERT操作が実行されると、データは単一のリージョンに書き込まれるため、書き込みホットスポットが発生します。
ホットスポットの問題を軽減するには、 SHARD_ROW_ID_BITS設定できます。行 ID は分散しており、データは複数の異なるリージョンに書き込まれます。
SHARD_ROW_ID_BITS = 416個のシャードを示しますSHARD_ROW_ID_BITS = 664個のシャードを示しますSHARD_ROW_ID_BITS = 0デフォルトの1シャードを示します
SHARD_ROW_ID_BITS = S設定すると、 _tidb_rowidの構造は次のようになります。
- 自動インクリメントビットの値はTiKVに格納され、順次割り当てられます。値が割り当てられるたびに、次の値は1ずつ増加します。自動インクリメントビットの値が使い果たされると(つまり、最大値に達すると)、以降の自動割り当てはエラー
Failed to read auto-increment value from storage engineで失敗します。 - 値の範囲は
_tidb_rowidです。最終的に生成される値の最大ビット数は、シャードビット + 自動インクリメントビットなので、最大値は(2^63)-1です。
注記:
シャードビットの選択(
S):
_tidb_rowidの合計ビット数は64であるため、シャードビットの数は自動インクリメントビットの数に影響します。シャードビットの数が増えると自動インクリメントビットの数は減り、その逆もまた然りです。したがって、自動インクリメント値のランダム性と利用可能な自動インクリメント領域のバランスを取る必要があります。- ベストプラクティスは、シャードビットを
log(2, x)に設定することです。ここで、xクラスタ内のTiKVノードの数です。たとえば、TiDBクラスタに16個のTiKVノードがある場合、シャードビットをlog(2, 16)(4に相当)に設定することをお勧めします。すべてのリージョンが各TiKVノードに均等にスケジュールされた後、バルク書き込みの負荷をさまざまなTiKVノードに均等に分散して、リソース利用率を最大化できます。
使用方法の詳細については、 ホットスポットの問題のトラブルシューティングガイド参照してください。
例
CREATE TABLE t (
id INT PRIMARY KEY NONCLUSTERED
) SHARD_ROW_ID_BITS = 4;
ALTER TABLE t SHARD_ROW_ID_BITS = 4;