ORDER BY 在 Cassandra 中的二级索引

ORDER BY over secondary index in Cassandra

我正在评估 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

在 Cassandra 中是否可行,还是我应该去别处看看?

在Cassandra 3.0中引入了物化视图
如果你使用的是cassandra 3.0以上版本,可以使用物化视图按非主键排序

像这样创建实体化视图:

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

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