为什么Cassandra在获取数据时反应比分裂到不同范围的查询要慢?

时间:2014-11-16 12:11:23

标签: cassandra bigdata cql

我正在设计如下所示的cassandra列家族

CREATE TABLE PLOT  
(  
PLOT_ID text,  
INDEX_VALUE double,  
VALUE_1 double,  
VALUE_2 double,  
VALUE_3 double,  
PRIMARY KEY(PLOT_ID,INDEX_VALUE));  

设计是这样的,我也可以在INDEX_VALUE范围内查询。
我希望表 PLOT PLOT_ID 的最大数量为2700000.
对于每个PLOT_ID, INDEX_VALUE 将在{0-30000}。

大多数情况下,我需要一次与PLOT_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;

它的反应非常快 可能是什么问题?
我的cassandra只有一个节点。 这是由于cassandra配置吗? 有关我设计的任何建议吗?

1 个答案:

答案 0 :(得分:1)

配置不是因素,而是Cassandra的工作方式。使用默认的Murmur3Partitioner(推荐),通过PLOT_ID分区键(复合主键)进行查询,检索由(PLOT_ID INDEX_VALUE)存储的所有行。当您在查询中包含INDEX_VALUE时,Cassandra会检索较少的数据,因此我认为这解释了为什么查询不需要这么长时间。在过去几年中,由于复合主键使用的聚类列等改进,Cassandra不再迭代给定行的所有列以检查哪个列与范围匹配。数据基于聚类列连续存储,并且可以有效地检索。