您可以发出两种类型的查询来从多个分区检索数据(我将使用 CQL 术语 - 分区是过去称为行的内容)。您使用哪一个取决于您是否知道分区键。
我将假设一个没有任何集群键的简单模式:
CREATE TABLE mytable (key text PRIMARY KEY, field text);
如果你不知道分区键,你可以发出
SELECT * FROM mytable LIMIT 15;
这将返回按分区哈希排序的前 15 行。因为它是按散列排序的,所以这种查询通常只有在您想要翻阅所有数据时才有用。
接收查询的节点(此查询的协调器)首先将其转发到具有最低令牌和副本的节点。它们最多返回 15 行。如果更少,则协调器将转发到具有第二低令牌和副本的节点。这种情况会一直发生,直到找到 15 行,或者直到所有节点都已联系。因此,此查询可能会联系集群中的每个节点。
复制因子大于 1 时,可能会返回冲突的结果。协调器查看时间戳以合并结果并仅将最新的返回给客户端。
如果您确实知道分区键,则可以使用
SELECT * FROM mytable WHERE key in ('key1', 'key2');
协调器将其视为接收单独的查询:
SELECT * FROM mytable WHERE key = 'key1';
SELECT * FROM mytable WHERE key = 'key2';
它将消息转发到为每个键保存数据的节点。每个键有一个,因此这些查询是并行执行的。响应在协调器上收集,合并以便只保留最新的,然后发送给客户端。