我正在设计如下所示的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配置吗?
有关我设计的任何建议吗?
答案 0 :(得分:1)
配置不是因素,而是Cassandra的工作方式。使用默认的Murmur3Partitioner(推荐),通过PLOT_ID分区键(复合主键)进行查询,检索由(PLOT_ID INDEX_VALUE)存储的所有行。当您在查询中包含INDEX_VALUE时,Cassandra会检索较少的数据,因此我认为这解释了为什么查询不需要这么长时间。在过去几年中,由于复合主键使用的聚类列等改进,Cassandra不再迭代给定行的所有列以检查哪个列与范围匹配。数据基于聚类列连续存储,并且可以有效地检索。