为什么Cassandra在获取数据时响应较慢,而不是对不同范围的查询进行拆分?

为什么Cassandra在获取数据时响应较慢,而不是对不同范围的查询进行拆分?,cassandra,bigdata,cql,Cassandra,Bigdata,Cql,我正在设计一个卡桑德拉家庭,如下所示 CREATE TABLE PLOT ( PLOT_ID text, INDEX_VALUE double, VALUE_1 double, VALUE_2 double, VALUE_3 double, PRIMARY KEY(PLOT_ID,INDEX_VALUE)); 该设计使我也可以在索引值范围内查询。 我预计表PLOT中的PLOT\u ID的最大数量为2700000。 每个绘图ID的索引值将为{0-30000} 大多

我正在设计一个卡桑德拉家庭,如下所示

CREATE TABLE PLOT  
(  
PLOT_ID text,  
INDEX_VALUE double,  
VALUE_1 double,  
VALUE_2 double,  
VALUE_3 double,  
PRIMARY KEY(PLOT_ID,INDEX_VALUE));  
该设计使我也可以在索引值范围内查询。
我预计表PLOT中的PLOT\u ID的最大数量为2700000。
每个绘图ID的索引值将为{0-30000}

大多数情况下,我一次需要与绘图ID相关的所有数据。 所以我使用这样的查询

SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 FROM PLOT WHERE PLOT_ID='p01';
但这需要很多时间。 所以我将查询拆分为如下所示

SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 FROM PLOT WHERE PLOT_ID='p01' and INDEX_VALUE <=1000 and INDEX_VALUE >=0;
SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 FROM PLOT WHERE PLOT_ID='p01' and INDEX_VALUE <=2000 and INDEX_VALUE >=1001;
....
....
....
SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 WHERE PLOT_ID='p01' and INDEX_VALUE <=30000 and INDEX_VALUE >=29001;
从PLOT_ID='p01'和INDEX_VALUE=0的绘图中选择索引值、值_1、值_2、值_3;
从PLOT_ID='p01'和INDEX_VALUE=1001的绘图中选择INDEX_值、VALUE_1、VALUE_2、VALUE_3;
....
....
....
选择索引_值、值_1、值_2、值_3,其中PLOT_ID='p01'和索引_值=29001;
而且它的响应速度相当快。
有什么问题吗?
我的cassandra只有一个节点。 这是因为卡桑德拉的配置吗?
对我的设计有什么建议吗?

配置不是一个因素,而是卡桑德拉的工作方式。使用默认的分区器(推荐),按绘图ID分区键(复合主键)进行查询将检索(绘图ID索引值)存储的所有行。当您在查询中包含INDEX_值时,Cassandra检索的数据较少,因此我认为这可以解释为什么查询不需要这么长时间。在过去的几年中,由于复合主键使用的集群列等改进,Cassandra不再迭代给定行的所有列以检查哪一列与某个范围匹配。数据是基于聚类列连续存储的,可以高效地检索。

我试图理解你的答案,但还是不明白。在分区键上有
where PLOT\u ID=12
子句,它应该只返回此行的所有数据,不是吗?据我所知,在
INDEX\u VALUE
上添加一个范围应该会使查询速度变慢,因为需要迭代给定行的所有列,并检查哪个列与范围匹配。很抱歉,不清楚。希望这次编辑能改进解释。表中PLOT_ID和INDEX_值的组合唯一地标识一行。我仍然有疑问:-)。你能看看吗?有一个类似于Java
Map
,所以行存储在Map中,集群列是
SortedMap
。有了这些,我仍然觉得我可以获取任何给定RowKey的所有数据(在本例中为
PLOT\u ID
)是合理的,而且这比将查询拆分为更小范围的查询更有效。可能有一种更有效的方法来模拟查询以获得所需内容,但易趣博客已经过时。超级列不再使用。2012年春()宣布了第一项重大变革。CQL 3.0与以前的CQL版本的一个重大区别是,WHERE子句可以包括除第一列之外的列上的大于/小于比较。如果你使用的是现代版的卡桑德拉,这是一个更好的信息来源。