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