我对Cassandra的查询结果有两个问题。
当我在Cassandra(即select * from table
)中对表进行“完整”选择时,保证结果将按分区令牌的递增顺序返回?
例如,有下表:
create table users(id int, name text, primary key(id));
是否可以保证以下查询将在令牌列中以增加的值返回结果?
select token(id), id from users;
如果是这样,如果数据分发到群集中的多个节点,是否也能保证?
如果上述问题的答案为“是”,如果我们使用二级索引,它仍然有效吗?例如,如果我们有以下索引:
create index on users(name);
我们使用索引查询表:
select token(id), id from users where name = 'xyz';
对结果的顺序有任何保证吗?
上述问题的动机是,如果在实现分页和/或恢复更长的“数据导出”时,令牌是正确的用法。
编辑:网上有多个资源说明订单与令牌订单匹配(例如,在partitioner results或this Datastax page的描述中):
如果没有WHERE子句中指定的分区键,则结果集的实际顺序将依赖于userid的散列值。
然而,官方Cassandra文档中未指定结果的顺序,例如。 SELECT statement。
答案 0 :(得分:2)
是否可以保证以下查询将在令牌列中以增加的值返回结果?
是的
如果是这样,如果数据被分发到集群中的多个节点,是否也能保证?
数据分布与检索数据的排序正交,无关系
如果上述问题的答案是“是”,如果我们使用二级索引,它仍然有效吗?
是的,即使您使用辅助索引(无论是SASI还是本机实现)查询数据,返回的结果将始终按令牌顺序排序。为什么?技术说明在我的博客文章中给出:http://www.doanduyhai.com/blog/?p=13191#cluster_read_path
这是解释为什么SASI不适合的主要原因,如果您希望搜索返回按某些列值排序的数据。只有真正的搜索引擎集成(如Datastax Enterprise Search)才能为您提供正确的排序,因为它会绕过集群读取路径层。