【问题标题】:What is the difference between a clustering column and secondary index in cassandracassandra中的聚簇列和二级索引有什么区别
【发布时间】:2014-07-08 01:47:22
【问题描述】:

我正在尝试了解这两者之间的区别以及您更愿意使用其中一个而不是另一个的场景。

我的具体用例是使用 cassandra 作为事件摄取系统,由解释事件的分析引擎支持。

我的模型包括

  • 事件 ID(分区键)
  • 事件时间(聚类列)
  • 事件类型(我不确定是使用聚簇列还是二级索引)

我认为最常见的读取场景是在一个时间范围内获取事件,因此事件时间是聚类列。读取频率较低的场景可能涉及按事件类型进一步过滤事件查询。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    二级索引与我们从常规关系数据库中了解到的非常相似。如果您有一个带有 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 是聚类列。每个分区的数据按主键定义的剩余列或列进行聚类。在物理节点上,当分区键的行基于集群列按顺序存储时

    【讨论】:

    • 索引列所需的内存是否更好/更差/与将该列作为聚类列所需的内存不同?
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 2010-09-10
    • 2014-01-16
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多