このトピックでは、PolarDB-Xがサポートするシーケンスとシーケンスの種類に関連する用語を紹介します。
PolarDB-Xは、プライマリキー列の値や一意のインデックスキー列の値など、グローバルに一意で連続的に増分される数値を生成するシーケンスを提供します。 PolarDB-Xシーケンスによって生成される値は、署名付き64ビット整数を格納するMySQL BIGINTデータ型です。
用語
このセクションでは、ビジネス要件に基づいてシーケンスタイプを選択するのに役立つシーケンスに関連する用語を紹介します。
連続: 連続するシーケンスの現在の値がnの場合、次の値はn + 1でなければなりません。 次の値がn + 1でない場合、シーケンスは非連続シーケンスである。
単調増加: 単調増加シーケンスの現在の値がnである場合、次の値はnより大きい数でなければなりません。
マクロレベルで単調増加し、ミクロレベルで単調増加します。たとえば、1、3、2、4、5、7、6、8、... を含むシーケンス。は、マクロレベルで単調増加し、ミクロレベルで非単調増加する。
ユニット化機能: ユニット化機能を使用すると、複数のインスタンスまたはデータベースにわたる複数のユニットを含むGROUPシーケンスを作成できます。 グローバルにユニークなシーケンス値は、複数のインスタンスまたはデータベースにわたって生成されます。
シーケンスの使用
PolarDB-Xシーケンスは、次の2つのカテゴリに分類されます。
明示的なシーケンス: DDLステートメントを使用して、明示的なシーケンスを作成および維持できます。 明示的なシーケンスは、独立した方法で使用することができる。
SELECT seq.nextval
ステートメントを実行して、明示的な順序で値を取得できます。 seqは、シーケンスの名前を指定します。暗黙的なシーケンス: 主キー列にAUTO_INCREMENT属性を指定すると、暗黙的なシーケンスを使用して主キー値を自動的に生成できます。 PolarDB-Xは、暗黙のシーケンスを自動的に保持します。 詳細については、「AUTO_INCREMENT」をご参照ください。
サポートされているシーケンスのタイプと機能
PolarDB-Xは、次のタイプのシーケンスをサポートします。
タイプ (略語) | 世界的にユニーク | 連続 | 単調に増加 | 単調に増加する同じセッション | データ型 | 可読性 | ユニット化機能 |
新しいシーケンス | はい | はい | はい | はい | すべての整数データ型がサポートされています。 | 高い | いいえ |
グループシーケンス | はい | いいえ | 継続しない | 継続する | すべての整数データ型がサポートされています。 | 高い | はい |
タイムシーケンス | はい | いいえ | マクロレベルで単調に増加し、ミクロレベルで単調に増加する | はい | BIGINTのみがサポートされています。 | 低い | いいえ |
新しいシーケンス
新しいシーケンスは、グローバルに一意で、連続し、単調に増加する値を生成します。 デフォルトでは、新しいシーケンスの値は自然数値であり、新しいシーケンスの開始値は1です。
AUTOモードのデータベースでシーケンスを作成するときに、PolarDB-XインスタンスのカーネルバージョンがV5.4.14以降で、シーケンスのタイプを指定しない場合、新しいシーケンスが作成されます。
INCREMENT BY、MAXVALUE、およびCYCLEまたはNOCYCLEパラメータを指定できるのは、PolarDB-X 5.4.17以降のインスタンスのみです。
新しいシーケンスの制限については、「新しいシーケンス」をご参照ください。
利点: グローバル一意性、連続性、単調増加、高性能、およびINCREMENT BY、MAXVALUE、およびCYCLEまたはNOCYCLEパラメータのサポート。
短所: GMS機能への依存と、他のタイプのシーケンスよりも多くのGMSリソースの占有。
例:
新しいシーケンスを作成し、シーケンスの開始値として100000を指定できます。 シーケンスは、グローバルに一意で連続的で単調に増加する値を生成します。 サンプルシーケンス値:
100000, 100001, 100002, 100003, 100004, ..., 199999, 200000, 200001, 200002, 200003,...
グループシーケンス
グループシーケンスは、グローバルに一意で100001から始まる自然数値を生成します。 グループシーケンス内の値は、連続的または単調に増加する必要はない。 デフォルトでは、グループシーケンスを作成するときにUNIT COUNTパラメーターまたはINDEXパラメーターを指定しないと、1つのユニットのみのグループシーケンスが作成されます。 ほとんどのシナリオでは、1つのユニットのみが必要です。
UNIT COUNTパラメーターの値として1を超える値を指定した場合、グループシーケンスには複数の単位が含まれます。 複数のユニットを含むグループシーケンスには、次の機能があります。
ユニットの数は、グループシーケンスに割り当てられるシーケンス空間を決定する。
各ユニットはINDEXパラメーターで指定されます。 各ユニットは、シーケンス空間のサブセットを占有する。
ユニットインデックスは重複できません。 単位ごとに異なるインデックスを指定する必要があります。 異なる単位の配列空間のサブセットは重複しない。 これは、シーケンスが異なるユニットに対して異なる値を生成することを示します。
PolarDB-Xは、複数のノードを使用してグループシーケンスの値を生成します。 このマルチノードモデルは、グループシーケンスの高可用性を保証します。 システムは、一度にデータベースから値のセグメントを取り出す。 ネットワーク切断などのシナリオでは、セグメント内のすべての値が使用されるわけではありません。 その結果、シーケンス値は不連続である。
利点: グループシーケンスは、グローバルに一意の値を生成し、高性能を提供し、単一障害点を引き起こさない。 グループシーケンスは、インスタンスまたはデータベース間で一意の値を提供することもできます。
デメリット: グループシーケンスに不連続な値が含まれ、指定された開始値から開始できない場合があります。
グループシーケンスの制限については、「グループシーケンス」をご参照ください。
例:
グループシーケンスを作成し、シーケンスの開始値として100000を指定できます。 シーケンスはグローバルに一意の値を生成します。 サンプルシーケンス値:
200001, 200002, 200003, 200004, 100001, 100002, 100003, 200005, 200006, ...
グループシーケンスの実際の開始値は、指定された開始値ではない場合があります。 実際の開始値は、指定された開始値よりも大きい値とすることができる。 この例では、指定された開始値は100000です。 ただし、シーケンスの実際の開始値は200001です。
グループシーケンスはグローバルに一意の値を生成し、不連続な値を含むことができます。 例えば、接続が閉じられたときにノードが故障した場合、またはシーケンス値のセグメント内のいくつかの値のみが使用された場合、シーケンス値は非連続値である。 上記の例では、200004と100001の間、および100003と200005の間の値は使用されません。
タイムシーケンス
タイムシーケンスの値は、タイムスタンプ、ノードID、シリアル番号で構成されます。 時間シーケンスは、グローバルに一意であり、マクロレベルで自動増加する値を生成します。 時系列における値の更新は、データベースに依存しない。 シーケンス値を永続的に保存するのではなく、シーケンス名と型をデータベースに保存するだけで済みます。 このように、タイムシーケンスは優れたパフォーマンスを提供できます。 サンプルシーケンス値: 776668092129345536、776668098018148352、776668111578333184、776668114812141568、...
利点: 時間シーケンスはグローバルに一意の値を生成し、優れたパフォーマンスを提供します。
短所: 時系列の値は不連続です。 START WITH、INCREMENT BY、MAXVALUE、CYCLE、およびNOCYCLEパラメータは、時間シーケンスに影響を与えない。
タイムシーケンスがテーブルの自動インクリメント列に関連付けられている場合、自動インクリメント列の値はBIGINTデータ型でなければなりません。
一般的なシナリオ
3種類のシーケンスはグローバルに一意の値を生成し、主キー列と一意のインデックスキー列で使用できます。
PolarDB-XインスタンスのカーネルバージョンがV5.4.14以降の場合、AUTOモードのデータベースではNEWシーケンスのみを使用することを推奨します。
デフォルトでは、グループシーケンスはDRDSモードのデータベースで使用されます。
グループシーケンスは、複数のユニットで構成されるアプリケーション、またはPolarDB-X 1.0から移行されるアプリケーションにのみ使用できます。
タイムシーケンスは、PolarDB-X 1.0から移行されたアプリケーションにのみ使用できます。