このドキュメントでは、シーケンスの主要な概念と、サポートされているシーケンスタイプについて説明します。
PolarDB-X 1.0 のシーケンスは、グローバルに一意な数値シーケンスを生成します。これは 64 ビットの数値で、MySQL の Signed BIGINT 型に相当します。シーケンスは、プライマリキー列および一意のインデックス列の値を生成するために一般的に使用されます。
基本概念
以下の概念は、適切なシーケンスタイプを選択するのに役立ちます:
- 連続:現在の値を n としたとき、次の値が常に n + 1 である場合、そのシーケンスは連続です。次の値が n + 1 であることが保証されない場合、そのシーケンスは非連続です。
- 単調増加:現在の値を n としたとき、次の値が常に n より大きい場合、そのシーケンスは単調増加です。
- 単一点:このシーケンスには単一障害点 (SPOF) があります。
- マクロレベルでは単調増加だが、ミクロレベルでは単調増加ではない:この用語は、
1, 3, 2, 4, 5, 7, 6, 8, ...のようなシーケンスを指します。このシーケンスは長期的には概ね増加しますが、隣接する値の間で厳密に増加するわけではありません。 - ユニット化能力:グローバルに一意な数値シーケンスを複数のインスタンスまたはデータベースに分散する能力です。
使用方法
PolarDB-X 1.0 では、シーケンスには主に 2 つの用途があります:
- 明示的なシーケンス:Sequence DDL 構文を使用して作成および管理し、独立して使用できます。次の値は
select seq.nextvalを使用して取得できます。ここで、seqはシーケンス名です。 - 暗黙的なシーケンス:プライマリキー列に AUTO_INCREMENT 属性を定義すると、プライマリキーが自動的に設定されます。PolarDB-X 1.0 は、このシーケンスを自動的に管理します。
サポートされているシーケンスタイプ
PolarDB-X 1.0 は、次の 4 つのシーケンスタイプをサポートしています:
| タイプ | グローバルに一意 | 連続 | 単調増加 | 接続内で増加 | 高可用性 | 型 | 可読性 | ユニット化能力 |
| グループシーケンス (GROUP) | はい | いいえ | いいえ | はい | はい | すべての整数型 | 良好 | いいえ |
| ユニットグループシーケンス (GROUP) | はい | いいえ | いいえ | はい | はい | すべての整数型 | 良好 | はい |
| 時間ベースのシーケンス (TIME) | はい | いいえ | マクロレベルでは単調増加だが、ミクロレベルでは単調増加ではない | はい | はい | BIGINT のみ | 不良 | いいえ |
| シンプルシーケンス (SIMPLE) | はい | はい | はい | はい | いいえ | すべての整数型 | 良好 | いいえ |
グループシーケンス (GROUP、デフォルト)
このシーケンスはグローバルに一意で、自然数を生成しますが、値が連続または単調増加であることは保証されません。シーケンスタイプを指定しない場合、PolarDB-X 1.0 はデフォルトでグループシーケンスを使用します。
このシーケンスは、複数ノードで値を生成して高可用性を確保します。システムは一度に値のブロックを取得します。このブロックが完全に使用されない場合、たとえば接続が切断されると、シーケンスギャップが発生します。
- メリット:グローバルに一意、単一障害点がない、優れたパフォーマンス。
- デメリット:シーケンスは連続ではなく、シーケンスギャップが発生する場合があります。指定した開始値から厳密に開始されず、サイクルをサポートしません。
ユニットグループシーケンス (GROUP)
ユニットグループシーケンスは、グループシーケンスにユニット化能力を追加したもので、インスタンスまたはデータベースをまたいでグローバルに一意な値を生成できます。ただし、連続または単調増加であることは保証されません。単一ユニットで構成する場合、ユニットグループシーケンスは通常のグループシーケンスと同等です。
- メリット:グループシーケンスのすべてのメリットに加え、ユニット化能力があります。
- デメリット:シーケンスは連続ではなく、シーケンスギャップが発生する場合があります。指定した開始値から厳密に開始されず、サイクルをサポートしません。
動作原理はグループシーケンスと同じです。拡張パラメーターオプションを使用して、カスタムのユニット数およびユニットインデックスをサポートします:
- ユニット数は、グローバルに一意な数値シーケンスの割り当て空間を決定します。
- 各ユニットは、ユニットインデックスで指定され、この割り当て空間のサブセットを占有します。
- 異なるユニット (異なるユニットインデックス) のサブセットは重複しないため、同じシーケンス値が生成されることはありません。
- 同じ割り当て空間を共有するすべてのユニットグループシーケンスは、同一のユニット数と、異なるユニットインデックスで構成する必要があります。
- V5.2: V5.2.7-1606682 (2018 年 4 月 27 日)
- V5.3: V5.3.3-1670435 (2018 年 8 月 15 日)
時間ベースのシーケンス (TIME)
時間ベースのシーケンスは、タイムスタンプ、ノード ID、およびシリアル番号を組み合わせて値を生成します。これにより、シーケンスはグローバルに一意となり、マクロレベルで増加します。生成された値はデータベースに永続化されず、データベースには名前とタイプ情報のみが保持されます。この設計により、優れたパフォーマンスを実現します。このシーケンスは 776668092129345536, 776668098018148352, 776668111578333184, 776668114812141568, ... のような値を生成します。
- メリット:グローバルに一意、優れたパフォーマンス。
- デメリット:シーケンスは連続ではありません。開始値、ステップサイズ、最大値、サイクルなどのパラメーターは、時間ベースのシーケンスには適用されません。
- テーブルの自動増分列に使用する場合、その列は BIGINT 型である必要があります。
- 時間ベースのシーケンスは、次のバージョンでサポートされています:
- V5.2: V5.2.8-15432885 (2018 年 11 月 27 日)
- V5.3: V5.3.6-15439241 (2018 年 11 月 29 日)
シンプルシーケンスは、ステップサイズ、最大値、およびサイクルを設定できる唯一のタイプです。
- メリット:グローバルに一意、連続、単調増加。最大値の設定やサイクルの有効化などの機能をサポートします。
- デメリット:単一障害点が発生し、パフォーマンスが低く、ボトルネックになる可能性があります。このタイプは慎重に使用してください。
生成される値ごとに永続化操作が必要です。
ユースケース
すべてのシーケンスタイプはグローバルな一意性を保証し、プライマリキー列および一意のインデックス列に使用できます。
- ほとんどのユースケースでは、グループシーケンスの使用を推奨します。
- グローバルに一意な数値シーケンスをインスタンスまたはデータベースに分散する必要がある場合は、ユニットグループシーケンスを使用します。
- アプリケーションがマクロレベルでのみ増加する値を許容でき、データベースに依存する割り当てメカニズムを回避したい場合は、時間ベースのシーケンスが適しています。
- アプリケーションで連続したシーケンス値が厳密に必要な場合は、シンプルシーケンスを使用する必要があります。パフォーマンスの制約に注意してください。
たとえば、開始値を 100000、ステップサイズを 1 としてシーケンスを作成するケースを考えます。
- シンプルシーケンスを使用する場合、
100000, 100001, 100002, 100003, 100004, ..., 200000, 200001, 200002, 200003, ...のように、グローバルに一意で、連続し、単調増加するシーケンスが厳密に生成されます。シンプルシーケンスでは永続化が保証されます。単一障害点が発生しても、サービスはブレークポイントから値の生成を再開し、シーケンスギャップは発生しません。このメカニズムでは生成される値ごとに永続化操作が必要となるため、パフォーマンスが低下します。 - グループシーケンスまたは ユニットグループシーケンスを使用する場合、生成されるシーケンスは
200001, 200002, 200003, 200004, 100001, 100002, 100003, ...のようになる場合があります。
- グループシーケンスは、指定した値 (この例では 100000) から厳密に開始されるわけではありませんが、それより大きい値から開始されることが保証されます。この例では、シーケンスは 200001 から開始されます。
- グループシーケンスはグローバルな一意性を保証しますが、シーケンスギャップが発生する場合があります。たとえば、ノードに障害が発生した場合、または値の一部のみを取得した後に接続が閉じられた場合に、シーケンスギャップが発生する可能性があります。この例で 200004 から 100001 にジャンプしていることは、シーケンスが単調増加ではないことを示しています。
- インスタンスまたはデータベースをまたいでグローバルな一意性を確保するには、ユニットグループシーケンスでは、同じ割り当て空間内の各シーケンスに同一のユニット数とそれぞれ異なるユニットインデックスを指定する必要があります。