1

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

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

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

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

4

2 回答 2

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 < 'mmm' )来获得与分区键相对应的物理行切片,在你的情况下将是词序比较。但关键是,由于它在磁盘上的特定顺序和 C* 已经偏移了与 'StringVal' 的值对应的各种记录,它可以进行非常有效的查找。

于 2016-07-22T15:39:36.027 回答
0

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

于 2016-07-22T13:00:09.397 回答