在Cassandra中实现低基数搜索的最佳实践是什么?

时间:2017-11-15 16:25:59

标签: cassandra cql cassandra-3.0

假设我有下表CQL(表格的一个片段):

CREATE TABLE order (
  order_id UUID PRIMARY KEY,
  placed timestamp,
  status text,
)

现在,如果状态可以是PLACED,SHIPPED或DELIVERED之一作为枚举,我想找到所有处于PLACED状态的订单来处理它们。鉴于订单数以百万计并且所有订单最终都处于交付状态,物化视图并不是解决问题的正确方法。我想知道有什么想法可以解决这个低基数索引的问题而不通过整个数据集。想法?

1 个答案:

答案 0 :(得分:2)

我会推荐像

这样的表格
CREATE TABLE order_by_status (
  order_id UUID,
  placed timestamp,
  status text,
  PRIMARY KEY ((status), order_id)
)

然后,您可以将查询迭代到SELECT * FROM order_by_status WHERE status = 'PLACED';。数百万不应该是一个问题,但通过在某个日期窗口划分来防止它变得太大是好的。

CREATE TABLE order_by_status (
  order_id UUID,
  placed timestamp,
  bucket text,
  status text,
  PRIMARY KEY ((status, bucket), order_id)
)

其中bucket是从YYYY-MM的2017-10时间戳生成的字符串。您可能想稍微远离MV,它在当前版本中有一些错误。我还建议针对此模型使用二级索引,使用第二个表并向两者发布插入将是您的最佳解决方案。