查询高基数字段

时间:2019-09-01 16:13:10

标签: database cassandra nosql query-optimization

我正在为即将进行的Cassandra迁移设计订单数据模型。订单具有orderId(arcane UUID字段)和orderNumber(用户友好编号)。可以使用两者之一来完成getOrder查询。

我的分区键是orderId,所以getByOrderId没问题。通过getByOrderNumber是-在orderId和orderNumber(高基数字段)之间存在一对一的映射,因此在每个节点上创建本地二级索引会减慢我的查询速度。

我想知道的是,我可以创建一个新表,将orderNumber作为分区键,并将orderId作为唯一列(二级索引,但由我维护)。因此,现在可以通过两个调用来解析getByOrderNumber查询。

如果上述解决方案有严重错误,请与我同在,对于Cassandra来说,我是一个新手。据我了解,对于这样的列,如果我使用本地二级索引,那么Cassandra将不得不向每个节​​点查询单个顺序。所以我想为什么不创建另一个存储映射的表。

我自己管理此索引会丢失什么?我可以看到是否每次写入都必须更新两个表。还有吗?

1 个答案:

答案 0 :(得分:3)

  

我想为什么不创建另一个存储映射的表。

没关系。来自Cassandra文档:

  

在这种情况下请勿使用索引

     

在高基数列上,因为您随后查询了大量的   记录少量结果。请参阅使用   下方的高基数列索引。

     

使用高基数列索引的问题

     

如果您在高基数列上创建索引,该列包含许多   不同的值,在字段之间进行查询会引起很多寻求   结果很少。在拥有十亿首歌曲的表中,通过   作家(通常是每首歌曲唯一的值),而不是   他们的唱片艺术家可能效率很低。.

     

手动将表维护为   索引的一种形式,而不是使用内置索引。对于列   包含独特的数据,有时使用起来性能不错   一个索引,为方便起见,只要查询量到表   具有索引列是中等的,并且不是在恒定负载下进行的。

     

相反,在基数极低的列上创建索引,   例如布尔值列,这没有任何意义。索引中的每个值   成为索引中的一行,导致所有   例如,假值。索引多个索引列   foo = true和foo = false没用。

Cassandra数据建模具有非规范化数据是正常的。