假设我定义了下表和二级索引:
CREATE TABLE ItemUpdates (
time timestamp,
item_name text,
item_context text,
item_descr text,
tags map<text, int>,
PRIMARY KEY ((time, item_name, item_context))
);
CREATE INDEX ItemUpdateByName
ON ItemUpdates(item_name);
CREATE INDEX ItemUpdateByContext
ON ItemUpdates(item_context);
CREATE INDEX ItemUpdateByTag
ON ItemUpdates(KEYS(tags));
数据模型的一般背景信息:项目在上下文中具有唯一名称,因此 (item_name, item_context) 是项目的自然键。标签有一些与之相关的价值。
我的应用程序中的一个自然查询是“向我显示带有特定标签的项目 X 的所有更新”。这转化为:
SELECT * FROM ItemUpdates
WHERE item_name='x'
AND item_context='a'
AND tags CONTAINS KEY 't';
当我尝试一些查询时,我注意到虽然集群使用了 Murmur3Partitioner,但结果是按时间排序的。当您考虑到 Cassandra 将二级索引存储为宽行并且列按其名称排序时,这是有道理的。
(1) Cassandra 在选择一个(n)(一组)索引列时是否总是返回按分区键排序的行?
我觉得这很有趣的原因是我的应用程序中的其他自然查询包括:
- 从日期 D 获取项目 X 的所有更新
- 获取项目 X 的 300 条最新更新
令我惊讶的是,ORDER BY time DESC
在 ItemUpdates 上的 select 语句中添加子句会导致错误消息“不支持带有 2ndary 索引的 ORDER BY”。
(2)(如何)通过选择索引列来缩小查询范围时,我可以对分区键进行范围查询吗?