Cassandra的结果顺序

Ada*_*yga 5 cassandra

我在Cassandra中有两个关于查询结果的问题.

  1. 当我在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)

    如果是这样,如果数据分发到群集中的多个节点,是否也能保证?

  2. 如果上述问题的答案为"是",如果我们使用二级索引,它仍然有效吗?例如,如果我们有以下索引:

    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语句.

doa*_*hai 3

是否保证以下查询将返回令牌列中值递增的结果?

是的

如果是的话,数据分布到集群的多个节点上是否也能保证?

数据分布与检索数据的顺序正交,没有关系

如果上述问题的答案是“是”,那么使用二级索引还有效吗?

是的,即使您使用二级索引(无论是 SASI 还是本机实现)查询数据,返回的结果也将始终按令牌顺序排序。为什么 ?技术解释在我的博客文章中给出:http://www.doanduyhai.com/blog/? p=13191#cluster_read_path

如果您希望搜索返回按某些列值排序的数据,这就是为什么 SASI 不适合的主要原因。只有真正的搜索引擎集成(例如 Datastax Enterprise Search)才能为您提供正确的排序,因为它绕过了集群读取路径层。