我正在评估一个解决方案的Cassandra用法,该解决方案需要查询分区键并获得按优先级列排序的前100个结果,这些结果不会出现在Clustered Key中。我只通过分片键查询。
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有可能还是我应该在其他地方看看?
答案 0 :(得分:1)
在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
答案 1 :(得分:0)
作为替代解决方案,您可能需要考虑Stratio’s Lucene indexes按任何索引列排序。