首页 > 解决方案 > 如何按 Cassandra 中的二级索引或列对结果进行排序?

问题描述

我正在寻找一个允许我按时间戳和区域过滤行的表。这是我下面的内容:

  CREATE TABLE event_start(  
        user_id text,  
        ts timestamp,  
        region text,  
        PRIMARY KEY(ts, region)  
    )  
    WITH CLUSTERING ORDER BY(region DESC);

当我尝试按区域选择和排序结果时,我遇到“仅当分区键受 EQ 或 IN 限制时才支持 ORDER BY”。我想我理解错误信息,但我无法构思解决方案。这会与主键与集群键有关吗?

谢谢!

标签: cassandranosqlsql-order-by

解决方案


您不能通过聚类列直接查询此表。您必须提供分区键(ts)。

您可以在没有分区键的情况下进行查询 - 仅通过集群列:但它会导致 Cassandra 扫描所有分区!!!!为此,您需要在查询中附加ALLOW FILTERING

以下是查询顺序:

  1. 首先——必须提供一个分区键
  2. 聚类列可以跟在后面
  3. 它可以对聚类列执行相等(=)或范围查询
  4. 所有的等式比较都必须在不等式比较之前
  5. 范围搜索是二进制搜索,然后是线性读取

您可以还原您的键列以满足您的查询:

CREATE TABLE event_start(  
      user_id text,  
      ts timestamp,  
      region text,  
      PRIMARY KEY(region, ts)  
  );

推荐阅读