我必须在每个查询中指定分区键和所有群集键吗?

时间:2018-07-20 02:13:44

标签: cassandra cql

例如,如果我的主键是a,而群集列是bc

我只能在以下条件下使用以下内容吗?

select * from table where a = 1 and b = 2 and c = 3

或者我可以使用其他查询吗?

我要使用

select * from table where a=1

select * from table where a = 1 and b = 2 and c = 3 and d = 4

有可能吗?

如果没有,那么我该如何为我的数据建模呢?

2 个答案:

答案 0 :(得分:4)

卡桑德拉(Cassandra)具有很多优点,但并不适合所有需求。

当您需要处理大量写入时,Cassandra是一个不错的选择。人们喜欢它,因为Cassandra易于扩展,因此可以处理庞大的数据集高度容错的

您需要记住,使用Cassandra(如果您真的想利用它)的基本规则是对数据进行建模以适合您的查询。不要围绕关系建模。不要围绕对象建模。 围绕查询进行建模。这样,您可以最大程度地减少分区读取。

当然,您不仅可以查询主键和分区列。您可以:

但是,当然,这些表并不像具有良好的表格那样有效。

答案 1 :(得分:0)

  

例如,如果我的主键是a,聚类列是b和c。

因此,这转换为以下定义:PRIMARY KEY ((a),b,c)。基于此...

  

我还可以使用其他查询吗?

是的。一些重要的要点;是带有主键的查询的WHERE子句:

  • 必须按顺序指定。
  • 不能跳过。
  • 可以省略,只要指定了它之前的键即可。

select * from table where a=1

是的,此查询将起作用。那是因为您仍在通过分区键(a)查询。

select * from table where a = 1 and b = 2 and c = 3 and d = 4

但是,这将 有效。这是因为d(基于我对您的第一句话的理解)并不属于您的PRIMARY KEY定义。

  

如果没有,那么我该如何为我的数据建模呢?

正如Andrea所说,您应该根据表需要支持的查询来构建表。因此,如果您需要按abc d进行查询,则需要输入d您的主键的一部分。