我正在为即将进行的Cassandra迁移设计订单数据模型。订单具有orderId(arcane UUID字段)和orderNumber(用户友好编号)。可以使用两者之一来完成getOrder查询。
我的分区键是orderId,所以getByOrderId没问题。通过getByOrderNumber是-在orderId和orderNumber(高基数字段)之间存在一对一的映射,因此在每个节点上创建本地二级索引会减慢我的查询速度。
我想知道的是,我可以创建一个新表,将orderNumber作为分区键,并将orderId作为唯一列(二级索引,但由我维护)。因此,现在可以通过两个调用来解析getByOrderNumber查询。
如果上述解决方案有严重错误,请与我同在,对于Cassandra来说,我是一个新手。据我了解,对于这样的列,如果我使用本地二级索引,那么Cassandra将不得不向每个节点查询单个顺序。所以我想为什么不创建另一个存储映射的表。
我自己管理此索引会丢失什么?我可以看到是否每次写入都必须更新两个表。还有吗?
答案 0 :(得分:3)
我想为什么不创建另一个存储映射的表。
没关系。来自Cassandra文档:
在这种情况下请勿使用索引:
在高基数列上,因为您随后查询了大量的 记录少量结果。请参阅使用 下方的高基数列索引。
使用高基数列索引的问题
如果您在高基数列上创建索引,该列包含许多 不同的值,在字段之间进行查询会引起很多寻求 结果很少。在拥有十亿首歌曲的表中,通过 作家(通常是每首歌曲唯一的值),而不是 他们的唱片艺术家可能效率很低。.
手动将表维护为 索引的一种形式,而不是使用内置索引。对于列 包含独特的数据,有时使用起来性能不错 一个索引,为方便起见,只要查询量到表 具有索引列是中等的,并且不是在恒定负载下进行的。
相反,在基数极低的列上创建索引, 例如布尔值列,这没有任何意义。索引中的每个值 成为索引中的一行,导致所有 例如,假值。索引多个索引列 foo = true和foo = false没用。
Cassandra数据建模具有非规范化数据是正常的。