【问题标题】:How Cassandra search on unique key of string?Cassandra如何搜索字符串的唯一键?
【发布时间】:2016-07-22 07:34:14
【问题描述】:

我想使用字符串(大约 6 到 7 个字符)作为复合主键中的唯一键。

我已经用谷歌搜索了在主键中使用字符串是否会影响性能,并发现它不会因为 Cassandra 使用散列来搜索唯一键。(请有人确认)

所以我想知道 Cassandra 使用什么技术来搜索唯一键,如果它使用散列,那么它使用哪种散列算法?并且还想知道 Cassandra 在发生冲突时会做什么,因为在散列中总是存在冲突的可能性。

Cassandra 使用 murmur3 散列来处理分区键。它是否使用相同的搜索唯一键?那么碰撞呢。

【问题讨论】:

    标签: hash cassandra string-hashing


    【解决方案1】:

    既然你提到了复合键,所以我假设你有一个这样的 PK,PRIMARY KEY(PartionKey, StringVal) 其中 StringVal 是 6 到 7 个字符,我想你想知道 C* 如何有效地为此记录PK。如果这是您的问题,那么答案在于 C* 如何存储数据。在此示例中,给定分区键的所有数据都使用“StringVal”作为排序顺序存储为一个物理行。因此,如果您对给定的 PartionKey 值说 100 万个唯一的“StringVal”,那么它们都将作为一个物理行(在磁盘上)存储在节点上(由 Partionkey 的哈希确定)并按默认升序排序'StringVal' 的顺序。 PK 中除分区键之外的所有列都称为“集群”列,因为它们决定了集群顺序。所以在这个例子中,复合键的第一列是分区键,第二列是集群列,它决定了分区键的所有记录的集群顺序。现在,如果您想获取特定的 PK 记录,因为 C* 将主键的偏移量存储在索引文件(列族的-Index.db 文件)中,因此获取 PK 的特定记录非常有效,因为它涉及到那个位置。这也允许 C 进行有效的范围查询,例如您可以通过指定“StringVal”的范围(如“nnn”> sv

    【讨论】:

    • 很好的答案,但我仍然不明白 Cassandra 将如何搜索字符串?它使用散列吗?
    • 谢谢!散列仅用于 PartionKey 而不是集群列。这种类型的散列称为一致散列,Cassandra 使用 murmer3partitioner。请参阅此以获取散列详细信息Consistent Hashing。您可能还会发现此链接很有用Compound keys Clustering
    【解决方案2】:

    分区键值经过哈希处理,然后用于定位拥有该令牌范围的节点。没有冲突这样的事情,因为哈希值对于一个值总是相同的。如果您使用相同的值分区键,您将写入将导致更新的现有分区。插入和更新都是相同的操作,称为 upsert。希望对您有所帮助。

    【讨论】:

    • @Matijia 感谢您的回复,我知道分区键冲突没有问题,但我想知道唯一键的架构
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多