PolarDB-X 1.0 シーケンスは、MySQL BIGINT 型 (符号付き 64 ビット整数) のグローバルに一意な数値を生成します。シーケンスを使用して、分散ノード全体でプライマリキー列と一意のインデックス列に値を設定します。
シーケンスタイプの選択
PolarDB-X 1.0 は 4 種類のシーケンスタイプをサポートしています。ワークロードが連続した値、インスタンス間の一意性、または最高のパフォーマンスを必要とするかどうかに基づいて選択してください。
| タイプ | グローバルに一意 | 連続 | 単調増加 | 同じセッション内で単調増加 | 非単一障害点 | データの型 | 可読性 | ユニット化 |
|---|---|---|---|---|---|---|---|---|
| グループシーケンス (GROUP) | はい | いいえ | いいえ | はい | はい | すべての整数型 | 高 | いいえ |
| ユニットグループシーケンス (GROUP) | はい | いいえ | いいえ | はい | はい | すべての整数型 | 高 | はい |
| 時間ベースシーケンス (TIME) | はい | いいえ | マクロレベルのみ | はい | はい | BIGINT のみ | 低 | いいえ |
| シンプルシーケンス (SIMPLE) | はい | はい | はい | はい | いいえ | すべての整数型 | 高 | いいえ |
要件に合ったタイプを選択してください:
ほとんどのワークロード — グループシーケンスを使用します。これはデフォルトのタイプであり、最高のパフォーマンスを提供し、単一障害点 (SPOF) を排除します。値はグローバルに一意ですが、ギャップが含まれる場合があります。
インスタンス間またはデータベース間の一意性 — ユニットグループシーケンスを使用します。これは、ユニット化機能でグループシーケンスを拡張するため、複数のインスタンスまたはデータベース間で値の一意性が維持されます。
連続しない ID を持つ高スループットの挿入 — 時間ベースシーケンスを使用します。値はデータベースから読み取られたり書き込まれたりしないため、書き込みオーバーヘッドはありません。シーケンスはマクロレベルでは単調増加しますが、ミクロレベルではそうではありません。
厳密に連続した値 — ワークロードがギャップのない単調増加 ID を必要とする場合にのみ、シンプルシーケンスを使用します。シンプルシーケンスは、生成されたすべての値を永続ストレージに書き込むため、ボトルネックと SPOF リスクが発生します。連続した ID が厳密な要件である場合にのみ使用してください。
基本概念
これらの用語を理解することで、上記の比較表を解釈するのに役立ちます。
連続: 現在の値が *n* の場合、次の値は *n + 1* である必要があります。
単調増加: 現在の値が *n* の場合、次の値は *n* より大きい必要があります。
マクロレベルでは単調増加、ミクロレベルでは非単調増加: 全体的な傾向は増加していますが、個々の値は順不同で到着する場合があります。例:
1, 3, 2, 4, 5, 7, 6, 8, ...単一障害点: 単一障害点 (SPOF) のリスクが存在します。
ユニット化機能: 複数のインスタンスまたは複数のデータベース間で一意な数値シーケンスを生成する機能。
各シーケンスタイプの仕組み
グループシーケンス (デフォルト)
グループシーケンスは、複数の DRDS ノードにわたって値の生成を分散します。各ノードは一度にデータベースから値のセグメントを取得し、そのセグメントからローカルに値を割り当てます。ネットワーク切断が発生した場合、またはセグメントが使い果たされる前に接続が閉じられた場合、そのセグメント内の残りの値はスキップされます。これが、グループシーケンス値が非連続である理由です。
利点: SPOF なし、優れたパフォーマンス、すべての整数データ型をサポート。
制限事項: 値は非連続です。実際の開始値は、START WITH で指定された値よりも常に大きくなります。値は循環的ではありません。
例: START WITH 100000 の場合、グループシーケンスは 200001, 200002, 200003, 200004, 100001, 100002, 100003... を生成する可能性があります。200004 と 100001 の間の値は、破棄されたセグメントにあったため欠落しています。
ユニットグループシーケンス
ユニットグループシーケンスは、ユニット化機能で拡張されたグループシーケンスと同じように機能します。ユニットインデックスとユニット数を構成して、インスタンスまたはデータベース全体でグローバルシーケンス空間をパーティション分割します。各ユニットは空間の重複しないサブセットを占有するため、PolarDB-X は 2 つの異なるユニットに対して同じ値を生成することはありません。
一貫した動作の要件:
同じシーケンス空間を共有するすべてのユニットグループシーケンスは、同じユニット数を持つ必要があります。
各シーケンスは、個別のユニットインデックスを持つ必要があります。
1 つのユニットのみを構成する場合、動作はグループシーケンスと同一です。
利点: すべてのグループシーケンスの利点に加えて、複数のインスタンスまたはデータベース間での一意性。
制限事項: 値は非連続です。実際の開始値は、START WITH よりも常に大きくなります。値は循環的ではありません。
ユニットグループシーケンスは、DRDS V5.2.7-1606682 以降 (2018年4月27日リリース) および V5.3.3-1670435 以降 (2018年8月15日リリース) で利用可能です。
時間ベースシーケンス
時間ベースシーケンスは、タイムスタンプ、ノード ID、およびシリアル番号から各値を構成します。システムは値を生成するときにデータベースから読み取ったり書き込んだりすることはありません。シーケンス名とタイプのみが保存されます。これにより、時間ベースシーケンスは最高スループットのオプションとなります。
値はグローバルに一意であり、マクロレベルでは自動インクリメントされます。ミクロレベルでは、同時実行ノードからの値がわずかに順不同で到着する場合があります。
利点: SPOF なし、優れたパフォーマンス、値の生成中にデータベース書き込みなし。
制限事項: 値は非連続です。START WITH、INCREMENT BY、MAXVALUE、および CYCLE/NOCYCLE パラメーターはサポートされていません。AUTO_INCREMENT 列に使用する場合、列は BIGINT 型である必要があります。
値の例: 776668092129345536, 776668098018148352, 776668111578333184, 776668114812141568…
時間ベースシーケンスは、DRDS V5.2.8-15432885 以降 (2018年12月27日リリース) および V5.3.6-15439241 以降 (2018年12月29日リリース) で利用可能です。
シンプルシーケンス
シンプルシーケンスは、生成されたすべての値をデータベースの永続ストレージに書き込みます。これにより、SPOF によって引き起こされる再起動後でも、値はグローバルに一意で連続し、単調増加することが保証され、生成は最後に永続化された値から再開されます。
シンプルシーケンスは、INCREMENT BY、MAXVALUE、および CYCLE/NOCYCLE をサポートする唯一のタイプです。
利点: 連続した単調増加値。最大値、ステップサイズ、および循環生成をサポートします。
制限事項: 値の生成ごとに永続書き込みが行われるため、SPOF の影響を受けやすく、パフォーマンスが低く、ボトルネックが発生します。連続した ID が厳密な要件である場合にのみ使用してください。
例: START WITH 100000 とステップサイズ 1 の場合、シンプルシーケンスは 100000, 100001, 100002, 100003, 100004, ..., 200000, 200001, ... を生成します。これは再起動後でもギャップがありません。
使用モード
タイプに関係なく、シーケンスは 2 つのモードで使用できます。
明示的シーケンス: DDL 構文を使用してシーケンスを作成および管理します。
SELECT seq.nextvalを使用して次の値を取得します。ここでseqはシーケンス名です。明示的シーケンスは独立してクエリおよび変更できます。暗黙的シーケンス: プライマリキー列に
AUTO_INCREMENT属性を追加します。PolarDB-X 1.0 は基盤となるシーケンスを自動的に作成および管理します。