Cassandra如何搜索字符串的唯一键?

时间:2016-07-22 07:34:14

标签: hash cassandra string-hashing

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

如果在主键中使用字符串会影响性能,并且发现不会因为Cassandra使用哈希来搜索唯一键而无法搜索。(有人请确认一下)

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

Cassandra使用murmur3哈希来处理分区键。它是否用于搜索唯一键?然后碰撞呢。

2 个答案:

答案 0 :(得分:1)

因为你提到了复合键,所以我假设你有一个这样的PK,PRIMARY KEY(PartionKey,StringVal),其中StringVal是6到7个字符,我想你想知道C *如何有效地为此记录PK。如果这是您的问题,那么答案就在于C *如何存储数据。在此示例中,使用“StringVal”作为排序顺序,将给定分区键的所有数据存储为一个物理行。因此,如果您对给定的PartionKey值说1百万个唯一的'StringVal',那么它们全部将被存储为节点上的一个物理行(在磁盘上)(由Partionkey的哈希确定)并按默认升序排序'StringVal'的顺序。 PK中除分区键之外的所有列都称为“聚类”列,因为它们决定了聚类顺序。因此,在此示例中,复合键的第一列是分区键,第二列是聚类列,它决定分区键的所有记录的聚类顺序。现在,如果您想获得特定的PK记录,因为C *存储索引文件中主键的偏移量(列系列的 -Index.db文件),获取PK的特定记录非常有效。它涉及寻找那个位置。这也允许C 进行有效的范围查询,例如你可以通过指定'StringVal'的范围来获得与分区键对应的一条物理行,如'nnn'> sv< 'mmm'在你的情况下将是词汇顺序比较。但重点是,由于它在磁盘上的特定顺序和C *已经偏移到对应于'StringVal'值的各种记录,它可以做非常有效的搜索。

答案 1 :(得分:0)

对分区键值进行哈希处理,然后将其用于定位拥有该令牌范围的节点。没有碰撞这样的东西,因为哈希值对于一个值总是相同的。如果使用相同值的分区键,则将写入将导致更新的现有分区。插入和更新都是名为upsert的相同操作。希望它有所帮助。