使用所有字段作为表中的分区键是cassandra的缺点吗?

时间:2018-03-26 13:27:13

标签: cassandra nosql cql cassandra-3.0 cqlsh

我的目标是根据以下查询获取 msgAddDate

  

选择max(msgAddDate)

     

来自样本表

     

其中reportid = 1且objectType =' loan'和msgProcessed = 1;

设计1:

这里的reportid,objectType和msgProcessed可能不是唯一的。为了添加唯一性,我添加了msgAddDate和msgProcessedDate(一个额外的唯一值)。

我使用此设计是因为我没有执行范围查询。

  

创建表样本表(reportid INT,

     

objectType TEXT,

     

msgAddDate TIMESTAMP,

     

msgProcessed INT,

     

msgProcessedDate TIMESTAMP,

     

PRIMARY KEY((reportid,msgProcessed,objectType,msgAddDate,msgProcessedDate));

设计2:

  

创建表样本表(

     

reportid INT,

     

objectType TEXT,

     

msgAddDate TIMESTAMP,

     

msgProcessed INT,

     

msgProcessedDate TIMESTAMP,

     

PRIMARY KEY((reportid,msgProcessed,objectType),msgAddDate,msgProcessedDate))   );

请根据表现建议使用哪一个以及两者之间的利弊。

1 个答案:

答案 0 :(得分:1)

设计2 是您想要的。

在设计1中,整个主键是分区键。这意味着您需要提供所有属性(可以是:reportid,msgProcessed,objectType,msgAddDate,msgProcessedDate),以便能够使用SELECT语句查询您的数据(这不会有用,因为您不会检索任何其他属性而不是你已经在WHERE statemenent中提供的那个)

在设计2中,您的分区键是reportid,msgProcessed,objectType,它们是您要查询的三个属性。大。 msgAddDate是第一个聚类列,它将自动为您排序。因此,您甚至不需要运行max,因为它已经排序。您需要做的就是使用LIMIT 1:

SELECT msgAddDate FROM sampletable WHERE reportid = 1 and objectType = 'loan' and msgProcessed = 1 LIMIT 1;

当然,请确保在msgAddDate上定义DESC排序顺序(我认为默认情况下它是升序...)

希望它有所帮助!