Lindorm ワイドテーブルエンジン(LindormTable)では、ペタバイト規模のデータを格納できます。 LindormTable のデータは、プライマリキーに基づいて範囲でパーティション分割され、ノード全体に均等に分散されます。 さらに、Lindorm は SQL 構文とインデックスをサポートしており、リレーショナルデータベースに似たエクスペリエンスを提供します。 ただし、Lindorm ワイドテーブルは、LSM ツリーを使用する分散 NoSQL データベースアーキテクチャに基づいて構築されているため、従来のリレーショナルデータベースとは異なります。 したがって、このトピックでは、Lindorm のデータモデルやデータ分散パターンなどの基本原則を最初に紹介し、Lindorm ワイドテーブルをより効果的に使用し、ビジネスにおける不適切なモデリング方法によって引き起こされるパフォーマンスとホットスポットデータの問題を回避できるようにします。
データモデル
LindormTable は行指向のストレージエンジンです。 LindormTable で次の SQL ステートメントを実行して、orders という名前のサンプルテーブルを作成できます。
CREATE TABLE orders (
channel VARCHAR NOT NULL, # 支払いチャネル(Alipay や WeChat など)を格納する列を指定します。
id VARCHAR NOT NULL, # 注文 ID を格納する列を指定します。
ts TIMESTAMP NOT NULL, # 注文の支払い日時を格納する列を指定します。
status VARCHAR, # 注文ステータスを格納する列を指定します。
location VARCHAR, # 注文の支払い場所を格納する列を指定します。
PRIMARY KEY(channel, id, ts) # テーブルのプライマリキーに channel、id、および ts 列が含まれることを指定します。
) WITH (DYNAMIC_COLUMNS='true'); # テーブルの動的カラムを有効にします。 この場合、テーブルスキーマで事前に定義しなくても、テーブルにプライマリキー以外の列を追加できます。LindormTable でテーブルが作成されると、次の表で説明されているデータモデルが構築されます。
プライマリキー列 | プライマリキー以外の列 | ||||
channel | id | ts | status | location | …… |
alipay | a0001 | 1705786502000 | 0 | shanghai | …… |
alipay | a0002 | 1705786502001 | 1 | beijing | …… |
…… | …… | …… | …… | …… | …… |
unionpay | u0001 | 1705786502056 | 0 | hangzhou | …… |
unionpay | u0002 | 1705786502068 | 1 | nanjing | …… |
…… | …… | …… | …… | …… | …… |
w0001 | 1705786502056 | 0 | shanghai | …… | |
w0002 | 1705786502068 | 0 | shanghai | …… | |
…… | …… | …… | …… | …… | …… |
プライマリキー列
行の列は、プライマリキー列とプライマリキー以外の列に分類できます。 テーブルのプライマリキーには複数の列を含めることができ、次の特性があります。
プライマリキースキーマは変更できません:Lindorm ワイドテーブルのプライマリキーは、テーブルの作成時に決定されます。 テーブルの作成後、プライマリキー列のデータ型と順序を追加、削除、または変更することはできません。 したがって、テーブルを作成する前に、テーブルのプライマリキーを慎重に設計してください。 ワイドテーブルのプライマリキーは、リクエスト処理のテーブルのパフォーマンスに大きく影響します。
プライマリキーはテーブル内で一意です:テーブルのすべてのプライマリキー列は、テーブル内で一意の行キーを形成します。 したがって、完全なプライマリキーに基づいて、テーブル内の一意の行を識別できます。
プライマリキーはクラスタ化インデックスとして使用されます:Lindorm ワイドテーブルでは、データはプライマリキー列の順序に基づいてクラスタ化されます。 たとえば、サンプルテーブル
ordersでは、channel列の値が同じ行はクラスタ化されます。 これらの行は、id列の値に基づいてさらにクラスタ化されます。 次に、id列の値が同じ行は、ts列の値に基づいてクラスタ化されます。このように、プライマリキーは、クエリ効率を高めるためのクラスタ化インデックスとして使用されます。 Lindorm は、MySQL と同様に、クエリを左端のプライマリキー列のデータに優先的に一致させます。 クエリにプライマリキーと一致する同等の条件を多く指定することで、クエリ対象のデータ量を減らすことができます。 クエリ条件に最も一致するプライマリキー列を左端のプライマリキー列として指定できます。 クエリでプライマリキー列に範囲条件が指定されている場合、他のプライマリキー列に他の同等の条件が指定されていても、左端のプライマリキーは優先的に一致しません。 この場合、LindormTable は大量のデータをスキャンしてフィルタリングし、クエリ対象のデータを見つける必要があります。
たとえば、次のステートメントを実行して、サンプルテーブル
ordersのデータをクエリできます。-- LindormTable は、channel 列の値が alipay で、id 列の値が a0089 より大きいすべての行をスキャンして、ts 列の値が 1705786502068 に等しい行を見つけます。 SELECT * FROM orders WHERE channel=="alipay" AND id > 'a0089' AND ts = 1705786502068;クエリ条件で左端のプライマリキー列が指定されていない場合、条件で他のプライマリキー列が指定されていても、LindormTable はテーブル内のすべての行をスキャンします。 次のステートメントは例を示しています。
-- LindormTable はテーブル内のすべての行をスキャンします。 SELECT * FROM orders WHERE id = 'a0089';前のステートメントでは、左端のプライマリキー列ではないプライマリキー列
idにクエリ条件が指定されています。 したがって、LindormTable はすべての行をスキャンして、id 列の値がa0089に等しい行を見つけますが、これは効率的ではありません。 ビジネスにおけるクエリのほとんどにid列の条件が含まれている場合は、id 列を左端のプライマリキー列として指定するか、id 列の個別のインデックステーブルを作成してクエリを高速化することをお勧めします。
プライマリキー以外の列
Lindorm では、テーブルスキーマで定義するのではなく、テーブルのプライマリキー以外の列を動的に定義できます。 HBase のプライマリキー以外の列の使用法と同様に、テーブルに存在するかどうかに関係なく、プライマリキー以外の列にデータを直接書き込むことができます。 詳細については、「動的カラム」をご参照ください。 また、ワイルドカードを使用してプライマリキー以外の列を定義することもできます。 たとえば、データ型が STRING の *_str 列にデータを書き込むステートメントを実行すると、名前が _str で終わるすべての STRING 列にデータを書き込むことができます。 詳細については、「ワイルドカードカラム」をご参照ください。
Lindorm では、プライマリキー以外の列のデータを更新できます。 テーブルにデータを書き込む場合、プライマリキー以外のすべての列の値を指定する必要はありません。 ただし、プライマリキーのみを含むデータ行を書き込むことはできないため、プライマリキー以外の少なくとも 1 つの列の値を指定する必要があります。 Lindorm ワイドテーブルのデータは、プライマリキーの順序に基づいて格納されます。 インデックスが作成されていないプライマリキー以外の列にクエリ条件を指定すると、テーブル内のすべてのデータがスキャンされ、クエリ対象のデータが特定されます。 デフォルトでは、この種のクエリは Lindorm によって拒否されます。 したがって、プライマリキー以外の列のデータをより効率的にクエリするには、プライマリキーに範囲条件を指定するか、プライマリキー以外の列にインデックスを作成します。
-- プライマリキー以外の列の条件のみを指定します。 この場合、テーブル内のすべてのデータがスキャンされます。
SELECT * FROM table WHERE location = 'shanghai';
-- プライマリキー列の条件を指定します。 この場合、channel 列の値が alipay である行のみがスキャンされ、location 列の値が shanghai である行が特定されます。
SELECT * FROM table WHERE location = 'shanghai' and channel='alipay'; データ分散
Lindorm は分散データベースサービスです。 Lindorm ワイドテーブルのデータは、プライマリキー値の範囲に基づいてリージョンにパーティション分割され、Lindorm インスタンスのすべてのノードに格納されます。 次の図は、Lindorm でデータがどのようにパーティション分割されるかを示しています。
Lindorm では、テーブルのデータはリージョンにパーティション分割されます。 各リージョンには、テーブルのデータの一部が格納されます。 すべてのリージョンは、プライマリキー値の範囲に基づいて連続してパーティション分割され、テーブルスペース全体を形成します。 たとえば、次のデータ行をテーブルに書き込むと、行は Region_3 に格納されます:{alipay,a100999,1705786502068}。 Region_3 のデータサイズがしきい値(デフォルトでは 8 GB)を超えるか、このリージョンで頻繁に読み書きされるホットスポットデータが検出されると、LindormTable はリージョンを 2 つのサブリージョンに分割します。これらは、元のリージョンの上部と下部です。 LindormTable は、負荷分散のためにワークロードに基づいて 2 つのサブリージョンを異なるノードに分散します。
同じプレフィックスを持つ行が異なるリージョンに格納される場合があります。 たとえば、リージョンに channel 列の値が alipay であるすべての行を完全に格納できない場合、これらの行は異なるリージョンに格納される場合があります。 前の図に示すように、channel 列の値が alipay である行は、Region_1、Region_2、および Region_3 に個別に格納されます。 Lindorm ワイドテーブルにデータを書き込むと、LindormTable は書き込まれたデータに基づいてリージョンを自動的に分割します。 このように、特定の範囲にクラスタ化されたホットスポットデータを心配する必要はなく、テーブルを作成するときに PARTITION BY 句を使用してテーブルをリージョンに分割する必要もありません。
事前分割リージョン
Lindorm はリージョンの自動分割をサポートしています。 したがって、Lindorm ワイドテーブルを作成するときにリージョンの範囲を指定する必要はありません。 LindormTable は、テーブルにデータが書き込まれると、テーブルのリージョンを自動的に分割します。 テーブルの特定のリージョンにデータを分散する必要がある場合は、テーブルを作成するときに事前分割リージョンの数を指定できます。 LindormTable は、読み取りリクエストと書き込みリクエストを分散するために、指定されたリージョンを複数のノードに格納します。 テーブルを作成するときに指定するリージョンの数は、初期リージョンの数のみであることに注意してください。 LindormTable は、テーブルにデータが書き込まれると、初期リージョンをさらに分割します。 テーブルを作成するときに事前分割リージョンを指定する方法の詳細については、「CREATE TABLE」をご参照ください。
テーブルの作成直後に大量のデータを書き込むか、Bulkload を使用してデータをテーブルにインポートする場合は、単一のノードが過負荷にならないように、必要なデータ分散に基づいて事前分割リージョンを指定することをお勧めします。
SQL または HBase API を使用してデータを書き込む予定の場合は、テーブルを作成するときに事前分割リージョンの数を
ノード数 x 4に設定できます。 最適な初期リージョンの数は、シナリオによって異なります。 ビジネス要件に基づいて事前分割リージョンの数を設定することをお勧めします。Bulkload を使用してデータをテーブルにインポートする場合は、事前分割リージョンの数を
インポートするデータのサイズ / 8に設定することをお勧めします。 このように、インポートされたデータは各リージョンに分散でき、これらのリージョンの分割はトリガーされません。
また、事前分割リージョンの範囲がデータ書き込みパターンに準拠していることを確認してください。 そうしないと、書き込まれたデータが特定のリージョンにのみクラスタ化される可能性があります。 この場合、多数の事前分割リージョンを指定しても、テーブルのパフォーマンスが低下する可能性があります。
ホットスポットデータ
分散システムは、リクエストを各リージョンに均等に分散するように設計されています。 このように、システムを水平方向にスケーリングして、より多くのデータでより多くのリクエストを処理できます。 システム内のデータの一部にのみ頻繁にアクセスすると、データはホットスポットデータになります。 この場合、ホットスポットデータが格納されているノードのパフォーマンスが、分散システム全体のパフォーマンスのボトルネックになります。
単一行ホットスポットデータ:単一行のデータが頻繁に読み書きされると、このデータ行は単一行ホットスポットデータになります。 同じ行のリクエストは常に同じノードに分散されます。 したがって、このノードのパフォーマンスがシステム全体のボトルネックになります。 この場合、ノードの仕様をスケールアップすることによってのみこの問題を解決できますが、システム内のノードの数をスケールアウトすることはできません。 ワイドテーブルで単一行ホットスポットデータを回避するには、テーブルを作成するときに適切なスキーマまたはプライマリキーを設計する必要があります。
範囲ホットスポットデータ:狭い範囲内のデータが頻繁に読み書きされると、データは範囲ホットスポットデータになります。 Lindorm ワイドテーブルは、プライマリキーの範囲に基づいてパーティション分割されます。 したがって、狭い範囲内のデータは同じリージョンに格納される場合があります。 したがって、範囲内のデータのリクエストは同じノードに分散され、システムのパフォーマンスのボトルネックになります。 Lindorm は狭い範囲内のホットスポットデータを識別し、リージョンを分割することでホットスポットデータを異なるノードに自動的に分散できます。 ただし、範囲ホットスポットデータを回避するために、テーブルにより分散されたプライマリキーを設計することをお勧めします。 たとえば、サンプルテーブル
ordersでは、HASH 関数を使用してid列の値をハッシュに変換し、この列をプライマリキーとして使用して、範囲ホットスポットデータを回避できます。増分プライマリキーによって引き起こされるホットスポット書き込みデータ:テーブルのプライマリキーが増分の場合、ホットスポット書き込みデータが存在する可能性があります。 Lindorm ワイドテーブルは、プライマリキーの範囲に基づいてパーティション分割されます。 したがって、リージョンがサブリージョンに分割されても、リージョンに後続で書き込まれるデータは、サブリージョンの下部にのみ格納されます。 たとえば、サンプルテーブル
ordersでは、プライマリキー列idは増分で、channel=alipay条件を満たす多数のデータレコードがテーブルに書き込まれます。 この場合、Region_3がRegion_3_aとRegion_3_bに分割されても、データはRegion_3_bにのみ書き込まれます。 増分プライマリキーによって引き起こされるホットスポット書き込みデータは、システムアーキテクチャのため、Lindorm では完全に解決できません。 したがって、増分列を最初のプライマリキー列として指定せず、プライマリキーに増分列を含めないことをお勧めします。重要Cassandra などの一部のデータベースまたはシステムでは、増分プライマリキー列のハッシュ値を含む列をパーティションキーとして使用します。 このように、テーブルの値を異なるパーティションに均等に分散できます。 ただし、データベースまたはシステムのいずれかから Lindorm にデータを移行する場合、増分プライマリキー列によってホットスポット書き込みデータが発生します。
プライマリキー設計
プライマリキーはテーブルのデータ分散とソートを決定するため、プライマリキーの設計は Lindorm ワイドテーブルにとって非常に重要です。 したがって、ワイドテーブルのリソースを適切に割り当てて効率的に使用するには、テーブルに適切なプライマリキーを設計する必要があります。 プライマリキーを設計する方法の詳細な推奨事項については、「Lindorm ワイドテーブルのプライマリキーを設計する」をご参照ください。
テーブルのプライマリキーを設計する際には、次の点に注意してください。
テーブル内の各行を一意に識別するという前提で、プライマリキーにはできるだけ少ないデータを含める必要があります。 JSON データまたは Web ページコンテンツを格納する列をプライマリキーに含めないでください。
最初のプライマリキー列のデータは個別化する必要があります。 最初のプライマリキー列に注文 ID などの増分値が含まれている場合は、プレフィックスとしてハッシュを値に追加するか(
hash(id)+id)、値を反転します(reverse(id))。最初のプライマリキー列には増分値を含めることはできません。 そうしないと、ホットスポットデータがテーブルの書き込みパフォーマンスの大きなボトルネックになります。 プライマリキー列に増分値を含める必要がある場合は、最初のプライマリキー列として指定しないでください。 最初のプライマリキー列の値が個別化されていることを確認してください。 たとえば、サンプルテーブル
ordersの最初のプライマリキー列はchannelで、これは増分列ではありません。 このように、channel列の値が同じデータは、増分列idの値に基づいて異なるリージョンにさらに分散され、ホットスポットデータが回避されます。テーブルにインデックステーブルが作成されていない場合、テーブルのクエリパフォーマンスは主にテーブルプライマリキーによって決まります。 したがって、テーブルプライマリキーを定義するときは、テーブルがクエリされるパターンを考慮する必要があります。
インデックステーブル設計
プライマリキーがビジネスのクエリ要件を満たせない場合は、クエリする列のセカンダリインデックスを作成できます。 詳細については、「セカンダリインデックス」をご参照ください。
セカンダリインデックスは、インデックス付き列をプライマリキーとして使用するインデックステーブルです。 したがって、セカンダリインデックスが作成される列は、プライマリキーと同じ方法で設計する必要があります。
インデックス付き列のクエリは、左端のセカンダリインデックスキー列から一致します。 たとえば、a、b、および c 列にフェデレーションセカンダリインデックスが作成されます。 クエリで b 列と c 列の条件のみが指定されている場合(SELECT * FROM tablename WHERE b=xx; など)、クエリはテーブル内のすべてのデータをスキャンします。
セカンダリインデックスが作成されたベーストテーブルにデータを書き込むと、データはベーストテーブルとインデックステーブルの両方に書き込まれます。 これにより、追加の書き込み操作が発生し、ベーストテーブルの書き込みパフォーマンスが低下する可能性があります。 したがって、テーブルの読み取りパフォーマンスと書き込みパフォーマンスを確保するために、テーブルに多数のセカンダリインデックスを作成しないでください。 また、セカンダリインデックスの列は変更できません。 作成されたセカンダリインデックスが要件を満たしていない場合は、削除してから別のセカンダリインデックスを作成することしかできません。 したがって、セカンダリインデックスは、頻繁に変更されないパターンのクエリに適用できます。 インデックスと組み合わせ条件を使用して多数の列を含むテーブルのデータをクエリする必要があるシナリオでは、Lindorm が提供する検索インデックス を使用することをお勧めします。
次の表に、Lindorm が提供する 2 種類のインデックスを示します。
インデックスタイプ | シナリオ | 依存関係 | リアルタイム表示 |
頻繁に変更されないパターンのクエリ。 | なし | はい | |
多数のインデックス付き列と組み合わせクエリ条件を含むオンラインクエリ。 | LindormSearch ノードを購入し、検索インデックス機能を有効にする必要があります。 | データを LindormSearch に同期する必要があるため、インデックスのレイテンシが発生します。 詳細については、「概要」をご参照ください。 |
データ書き込み
テーブルプライマリキーの設計に準拠したパターンで、ワイドテーブルにデータを書き込む必要があります。 このように、書き込まれたデータは各ノードに均等に分散され、パフォーマンスのボトルネックが回避されます。 テーブルに複数のデータ行をバッチで書き込むことができます。 これは、リモートプロシージャコール(RPC)の数を減らすため、単一行書き込みよりも効率的です。 このように、テーブルに書き込まれた複数の行をサーバーでバッチ処理できるため、スループットがより効率的に利用されます。 ただし、バッチで大量のデータ行を書き込まないでください。 そうしないと、サーバーのメモリが不足したり、フルガベージコレクションがトリガーされる可能性があります。 この場合、Lindorm のサービス安定性が低下する可能性があります。 バッチで合計 2 MB 以下のデータを書き込むことをお勧めします。
ApsaraDB for HBase API または SQL を使用して、Lindorm ワイドテーブルにデータを書き込むことができます。 SQL を使用してテーブルが作成され、テーブルの各列のデータ型(INT や LONG など)が定義されている場合、ApsaraDB for HBase API を使用してこれらの列にデータを書き込んだ後、SQL を使用して列からデータをクエリできない場合があります。 SQL を使用して作成されたテーブルには、SQL を使用してのみアクセスできます。 対照的に、ApsaraDB for HBase API を使用して作成されたテーブルには、SQL でアクセスできます。 カラムマッピングを設定して、テーブルスキーマを変更できます。 詳細については、「SQL を使用して HBase テーブルにアクセスする」をご参照ください。
データクエリ
単一値クエリと範囲クエリ
Lindorm ワイドテーブルでは、一般的に 2 種類のクエリが実行されます。単一値クエリと範囲クエリです。
単一値クエリ
クエリですべてのプライマリキー列に条件を指定すると、クエリは単一値クエリになります。 例:
SELECT * FROM orders WHERE channel='alipay' AND id='a0001' AND ts=1705786502000;
SELECT * FROM orders WHERE channel='alipay' AND id='a0001' AND ts IN (1705786502000, 1705786502222, 1705786502333);
SELECT * FROM orders WHERE channel='alipay' AND id IN ('a0001', 'a0002', 'a0003') AND ts IN (1705786502000, 1705786502222, 1705786502333);
SELECT * FROM orders WHERE channel IN ('alipay', 'wechat', 'unionpay') AND id IN ('a0001', 'a0002', 'a0003') AND ts IN (1705786502000, 1705786502222, 1705786502333);前の例では、最初のステートメントは単一行で実行される単一値クエリであり、他のステートメントは複数行で実行される単一値クエリです。 2 番目のステートメントでは、ts 列に複数の条件が指定されています。 したがって、複数のデータ行が返されます。 3 番目のステートメントでは、id プライマリキー列と ts プライマリキー列に 3 つの IN 条件が個別に指定されています。 したがって、このステートメントは 9(3 x 3) 行のデータをスキャンします。 同様に、4 番目のステートメントは 27(3 x 3 x 3) 行のデータをスキャンします。 単一値クエリでより多くの IN 条件を指定すると、条件セットのデカルト積に基づいて条件が結合されます。 この場合、より多くのデータ行がリクエストされ、クエリされます。 Lindorm ワイドテーブルの複数行で単一値クエリを実行すると、すべてのクエリ結果が一度に返されます。 したがって、より多くの行で単一値クエリを実行する場合、Lindorm はより多くのデータ行をスキャンし、より大きな結果セットを返す必要があります。 この場合、サーバーのメモリが不足したり、フルガベージコレクションがトリガーされる可能性があります。 したがって、多数の行で同時に単一値クエリを実行しないでください。また、クエリ内の IN 条件とその組み合わせの数を減らしてください。
デフォルトでは、Lindorm で一度に最大 2,000 件の単一値クエリを実行できます。 そうしないと、Multi Get Plan query too many rows in one select エラーが返されます。 多数の単一値クエリを実行する必要があり、クエリによって Lindorm インスタンスのメモリが不足しないようにするには、テクニカルサポート(DingTalk ID:s0s3eg3)に連絡して制限を増やしてください。
範囲クエリ
クエリにテーブルのプライマリキー列の条件が含まれていない場合、またはテーブルのプライマリキー列の一部にのみ条件が含まれている場合、クエリは範囲クエリになります。 例:
SELECT * FROM orders;
SELECT * FROM orders WHERE channel='alipay';
SELECT * FROM orders WHERE channel='alipay' AND id='1705786502001';
SELECT * FROM orders WHERE channel='alipay' AND id IN ('a0001', 'a0002', 'a0003');
SELECT * FROM orders WHERE channel IN ('alipay', 'wechat', 'unionpay') AND id IN ('a0001', 'a0002', 'a0003');上記のステートメントはすべて範囲クエリです。テーブルのすべてのプライマリキー列の条件が含まれていないためです。
Lindorm は、クエリがテーブル内のすべてのデータをスキャンする場合でも、メモリを不足させることなく、範囲クエリのすべての結果をストリーミングデータとして返すことができます。 したがって、一度に実行できる範囲クエリの最大数に制限はありません。 ページごと、または指定されたカーソルに基づいて結果を返すために、クエリステートメントに LIMIT または OFFSET を追加する必要はありません。
ORDER BY クエリ
Lindorm ワイドテーブルのデータはプライマリキーでソートされます。 したがって、SELECT ステートメントで ORDER BY 句を指定しなくても、クエリ結果はプライマリキーの順序で返されます。 ただし、クエリの条件がインデックステーブルにヒットした場合、結果はインデックステーブルの順序で返されます。これは、インデックステーブルが作成された列の順序です。
ORDER BY 句に複数の列を指定すると、結果は列によって左から右の順序でソートされます。 インデックスを効率的に使用するには、ORDER BY 句に左端のプライマリキー列を含める必要があります。 左端以外のプライマリキー列またはプライマリキー以外の列のみを ORDER BY 句に指定すると、返された結果をソートするための大量の計算操作が実行されます。 したがって、左端のプライマリキー列を使用して結果をソートするか、結果のソートに使用するプライマリキー以外の列のセカンダリインデックスを作成することをお勧めします。 また、クエリ結果を降順(ORDER BY DESC)でソートする場合は、テーブルの作成に使用されるステートメントに DESC キーワードを追加することをお勧めします。 このように、データは降順に格納され、最適化されたクエリパフォーマンスが提供されます。 ORDER BY 句の使用方法の詳細については、「大きな結果セットで ORDER BY を使用する」をご参照ください。
COUNT クエリ
Lindorm は、LSM ツリーストレージ構造に基づいて構築された NoSQL データベースサービスです。 この構造では、データは複数回変更または削除される可能性があるため、複数のバージョンのデータと削除マーカーが格納されます。 したがって、Lindorm の基盤となるストレージは、各テーブルの行数をテーブルメタデータに格納しません。 テーブルの行数を正確にクエリするには、テーブル内のすべてのデータをスキャンする必要があります。 したがって、大量のデータを含むテーブルの行数をクエリするには、長い時間がかかります。 テーブルの推定行数のみを取得する必要がある場合は、「テーブルの行数をカウントする」をご参照ください。
COUNT クエリで条件が指定されている場合、クエリの期間は、指定された条件下でスキャンする必要があるデータ量によって異なります。 たとえば、SELECT count(*) FROM table WHERE channel = 'alipay'; ステートメントを実行すると、channel 列の値が alipay である行数がカウントされます。
データ削除
Lindorm ワイドテーブルからデータ行を削除すると、Lindorm は行をすぐに削除するのではなく、削除マーカーを追加します。 このデータ行は、COMPATCTION 操作が実行されるまで完全に削除されません。 データ行が完全に削除される前に、行とそれに追加された削除マーカーの両方をクエリできます。 ただし、Lindorm によってクエリ結果から除外されます。 したがって、多数のデータ削除操作を実行すると、より多くの削除マーカーが生成され、クエリパフォーマンスが低下する可能性があります。 データを直接削除する代わりに、テーブルの TTL 属性を設定して、不要になったデータを定期的にクリアすることをお勧めします。 ビジネスで多数のデータ削除操作を実行する必要がある場合は、COMPACTION 操作の短い間隔を指定して、削除されたデータと削除マーカーをより迅速にクリアできます。 TTL 属性と COMPACTION 操作が実行される間隔の設定方法の詳細については、「ALTER TABLE」をご参照ください。
セカンダリインデックスが作成されたテーブルのデータを更新すると、Lindorm は最初にセカンダリインデックステーブルの対応するデータを削除してから、更新されたデータをセカンダリインデックステーブルに挿入します。 したがって、ベーストテーブルの大量のデータを更新すると、セカンダリインデックステーブルにも多数の削除マーカーが生成され、インデックステーブルのクエリパフォーマンスが低下する可能性があります。 COMPACTION 操作の短い間隔を指定して、削除マーカーをより迅速にクリアできます。
ただし、COMPACTION 操作の間隔が短いと、システムの負荷が増加します。 実際の要件に基づいて設定してください。
追加情報
LindormTable は LSM ツリーストレージ構造に基づいて構築されています。 バージョニング、タイムスタンプ、TTL などの固有の機能に慣れていない場合、不適切な使用法により、書き込み操作とクエリ操作の結果が期待どおりにならない可能性があります。 この場合は、「予期しないクエリ結果の一般的な原因」をご参照ください。
Lindorm ワイドテーブルを使用する場合は、CPU、ネットワーク、ディスク容量などのインスタンスリソースの使用状況を監視して、リソース不足によるパフォーマンスの低下を回避する必要があります。 また、サーバー上のファイル数、各リージョンのサイズ、および COMPACTION 操作にバックログがあるかどうかに注意する必要があります。 これにより、データ書き込みクエリが Lindorm の制限を超えないようにします。 Lindorm の制限の詳細については、「クォータと制限」をご参照ください。
一般的なエラーの解決方法の詳細については、「FAQ」をご参照ください。