我正在尝试理解这两者之间的区别以及您希望使用其中一种方案的方案。
我的具体用例是使用cassandra作为事件提取系统,该系统由解释事件的分析引擎支持。
我的模型包括
我认为最常见的读取方案是在一个时间范围内获取事件,因此事件时间是聚类列。较不频繁的读取方案可能涉及按事件类型进一步过滤事件查询。
答案 0 :(得分:10)
二级索引与我们从常规关系数据库中所知道的非常相似。如果您的查询包含使用不属于主键的列值的where子句,则查找会很慢,因为必须执行完整行搜索。二级索引可以有效地为这些查询提供服务。二级索引存储为额外的表,只存储额外的数据,以便在主表中轻松找到您的方式。
这是一个很好的指数,我们已经知道了。到目前为止,cassandra及其分布式性质并不新鲜。
分区和聚类就是决定主表中的行如何在节点之间传播。这是cassandara独有的,因为它决定了数据的分布。因此,主键至少包含一列。主键中的第一列用作分区键。分区键用于决定存储行的节点。如果主键具有其他列,则列用于对给定节点上的数据进行聚类 - 数据通过聚类列以节点顺序存储在节点上。
此问题有关群集列的更多细节:Clustering Keys in Cassandra
因此,给定列X上的索引使查找X --> primary key
有效。分区键(主键中的第一列)确定存储行的节点。聚类列(主键中的其他列)确定在指定节点上存储哪些订单行。
所以你的直觉听起来是正确的 - 事件ID可能保证是独一无二的,所以非常适合构建主键。事件时间是在给定节点上的磁盘上排序行的好方法。
如果您从不需要按事件类型查找数据,例如,从未有像SELECT * FROM Events WHERE Type = Warning
那样的查询,那么您不需要额外的索引,但您对分区的要求不会改变。索引可以轻松地为不同谓词的查询提供服务。既然你提到你确实计划执行这样的查询,你实际上可能想要在你的EventType列上有一个索引。
查看cassandra文档:http://www.datastax.com/documentation/cql/3.0/cql/ddl/ddl_compound_keys_c.html
Cassandra使用主键定义中的第一个列名作为分区键。
... ... 在播放列表表的情况下,song_order是聚类列。每个分区的数据由主键定义的其余一列或多列聚类。在物理节点上,当基于聚类列按顺序存储分区键的行时