我对Cassandra很新,我想知道如果询问" date =' 2015-01-01'&是否会对性能产生任何影响#34;或者"日期> =' 2015-01-01' AND date< =' 2015-01-01'"。
我想要使用这样的范围的唯一原因是因为我需要进行多个查询,并且我想要准备它们(如在预准备语句中)。这样,准备好的报表编号减半。
在我要使用的两个表中使用的键是((key1,key2),date)和(key1,date,key2)。第一个表的查询类似于:
SELECT * FROM table1
WHERE key1 = val1
AND key2 = val2
AND date >= date1 AND date <= date2
答案 0 :(得分:1)
对于PRIMARY KEY (key1, date, key2)
这种类型的查询是不可能的。如果你这样做,你会看到如下错误:
InvalidRequest:code = 2200 [无效查询] message =“PRIMARY KEY列 “key2”不能被限制(前一栏“日期”不是 限制或非EQ关系)“
如果前面的列被除了equals运算符之外的任何其他列过滤,Cassandra将不允许您通过PRIMARY KEY组件进行过滤。
另一方面,您对PRIMARY KEY ((key1, key2), date)
的查询可以正常运行。原因是,Cassandra使用聚类键(在本例中为date
)来指定分区内数据的磁盘排序顺序。在指定分区键(key1
和key2
)时,结果集将按date
排序,从而允许Cassandra通过从磁盘执行连续读取来满足您的查询。
为了测试一下,我甚至会在一张带有类似密钥的桌子上运行两个查询,然后打开tracing:
SELECT * FROM log_date2 WHERe userid=1001
AND time > 32671010-f588-11e4-ade7-21b264d4c94d
AND time < a3e1f750-f588-11e4-ade7-21b264d4c94d;
返回1行并在4068微秒内完成。
SELECT * FROM log_date2 WHERe userid=1001
AND time=74ad4f70-f588-11e4-ade7-21b264d4c94d;
返回1行并在4001微秒内完成。