我有一个列族使用计数器作为下面的create table命令:( KEY我使用bigin来过滤查询时)。
CREATE TABLE BannerCount (
KEY bigint PRIMARY KEY
) WITH
comment='' AND
comparator=text AND
read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
default_validation=counter AND
min_compaction_threshold=4 AND
max_compaction_threshold=32 AND
replicate_on_write='true' AND
compaction_strategy_class='SizeTieredCompactionStrategy' AND
compression_parameters:sstable_compression='SnappyCompressor';
但是当我将数据插入此列族时,并选择使用Where
命令来过滤数据
结果我重新发现非常奇怪:(像那样:
使用查询:
select count(1) From BannerCount where KEY > -1
count
-------
71
使用查询:
select count(1) From BannerCount where KEY > 0;
count
-------
3
使用查询:
select count(1) From BannerCount ;
count
-------
122
我的查询会发生什么,谁告诉我为什么会这样:( :(
答案 0 :(得分:2)
要了解其原因,您应该了解Cassandra的数据模型。您可能在这里使用RandomPartitioner
,因此表格中的每个KEY值都会被标记为令牌值,因此它们会以分布式方式存储在您的响铃中。
因此,找到其键值大于X的所有行不是Cassandra优化的查询类型。您可能应该在其他值上键入行,然后对bigint值使用宽行(因为列已排序)或将它们放在第二列中,并在其上创建索引。
更详细地解释为什么你的结果看起来很奇怪:CQL 2隐式地将“KEY >= X
”变成“token(KEY) >= token(X)
”,这样一个查询器可以在某种程度上迭代所有的行 - 有效的方式。实际上,您正在查找 hash 大于X的 hash 的所有行。有关在CQL 3中如何解决这种混淆,请参阅CASSANDRA-3771那就是说,正确的解决方法是根据您希望在其上运行的查询来构建数据。