複数のパーティションからデータを取得するために発行できるクエリには 2 種類あります (ここでは CQL 用語を使用します。パーティションは以前は行と呼ばれていました)。どちらを使用するかは、パーティション キーを知っているかどうかによって異なります。
クラスタリング キーを持たない単純なスキーマを想定します。
CREATE TABLE mytable (key text PRIMARY KEY, field text);
パーティションキーがわからない場合は、発行できます
SELECT * FROM mytable LIMIT 15;
これにより、パーティションのハッシュ順に並べられた最初の 15 行が返されます。ハッシュによって順序付けられるため、このようなクエリは通常、すべてのデータをページングする場合にのみ役立ちます。
クエリを受信したノード (このクエリのコーディネーター) は、まずトークンとレプリカが最も低いノードにクエリを転送します。最大 15 行が返されます。少ない場合、コーディネーターは 2 番目に低いトークンとレプリカを持つノードに転送します。これは、15 行が見つかるまで、またはすべてのノードに接続されるまで発生します。したがって、このクエリは、クラスター内のすべてのノードに接続する可能性があります。
複製係数が 1 より大きい場合、矛盾する結果が返される可能性があります。コーディネーターはタイムスタンプを見て結果をマージし、最新のものだけをクライアントに返します。
パーティションキーがわかっている場合は、使用できます
SELECT * FROM mytable WHERE key in ('key1', 'key2');
コーディネーターは、これを別のクエリを受け取るのと同じように扱います。
SELECT * FROM mytable WHERE key = 'key1';
SELECT * FROM mytable WHERE key = 'key2';
各キーのデータを保持するノードにメッセージを転送します。キーごとに 1 つあるため、これらのクエリは並行して実行されます。応答はコーディネーターで収集され、最新のものだけが残るようにマージされ、クライアントに送信されます。