2

我正在评估 Cassandra 对解决方案的使用情况,该解决方案需要查询分区键并获得按优先级列排序的前 100 个结果,这些结果不在集群键中。我只通过分片键查询。

CREATE TABLE my_table (
shard_key int,
enity_id int,
priority int, 
PRIMARY KEY ((shard_key), entity_id)
);
CREATE INDEX prio ON my_table (priority);

我可以编写一个高效的 CQL 查询吗

SELECT * FROM my_table WHERE shard_key=1 ORDER BY priority LIMIT 100

在卡桑德拉有可能还是我应该去别处看看?

4

2 回答 2

1

在 Cassandra 3.0 中引入了 Materialized View
如果您使用的是 cassandra 3.0 或更高版本,您可以使用 Materialized view 按非主键排序

创建一个像这样的物化视图:

CREATE MATERIALIZED VIEW my_table_view AS
    SELECT shard_key, priority, entity_id
    FROM my_table
    WHERE shard_key IS NOT NULL AND priority IS NOT NULL AND entity_id IS NOT NULL
    PRIMARY KEY (shard_key, priority, entity_id);

假设您在 my_table 上有这些数据:

 shard_key | entity_id | priority
-----------+-----------+----------
         1 |        10 |      100
         1 |        11 |      101
         1 |        12 |      102
         1 |        13 |      103
         2 |        20 |      200

现在您可以像这样查询:

SELECT * FROM my_table_view WHERE shard_key = 1 ORDER BY priority ASC LIMIT 100;

输出将是:

 shard_key | priority | entity_id
-----------+----------+-----------
         1 |      100 |        10
         1 |      101 |        11
         1 |      102 |        12
         1 |      103 |        13
于 2017-03-04T03:34:19.740 回答
0

作为替代解决方案,您可能需要考虑Stratio 的 Lucene 索引以按任何索引列排序。

于 2017-03-06T12:12:15.040 回答