我正在使用Cassandra 1.2.1,复合键并尝试获取特定partitionID的所有记录。以下是我正在使用的架构:
主键是复合键:(TimeStamp,Device ID)。因此,TimeStamp是分区键。每条记录将为70-80字节。
有1000种不同的TimeStamp,每个时间戳有500K设备ID。所以有5亿条记录,我想获取特定时间戳的所有记录。类似于:
从架构中选择*,其中TimeStamp ='..'
我的理解是这个查询应该能够快速获取所有记录,因为相关的行都存储在连续的磁盘位置,这意味着很少的磁盘搜索会给我们带来结果。过滤器在TimeStamp上,这意味着只有一个节点将被查询命中。此外,数据总量为500K * 80字节~40 MB,这并不是很多。但是,当我使用CQL(3)或Astyanax运行它时,我将获得RPC超时。
我的理解是,partitionID的所有记录都在连续的磁盘位置错误吗?批量获取此类数据的正确方法是什么?
答案 0 :(得分:1)
最终,列将在磁盘上彼此靠近,因为它们位于同一行中。但是在压缩完成之前(即假设你没有运行nodetool compact),它们将不会。但它们应该分成几个SSTables。
然而,较慢的事情可能是CPU反序列化,比较其他副本的结果并序列化回客户端。我怀疑你能在rpc_timeout中为500k对象做到这一点(默认为10秒)。
为此,您应该翻阅结果。
首次查询,请执行
SELECT * from schema where TimeStamp = '..' limit 1000
然后取最后一个设备ID并最后调用它:
SELECT 'last'..'' from schema where TimeStamp = '..' limit 1000
直到您在响应中获得少于1000列。