【问题标题】:Order of results in CassandraCassandra 中的结果顺序
【发布时间】:2018-04-11 05:04:38
【问题描述】:

我有两个关于 Cassandra 查询结果的问题。

  1. 当我在 Cassandra(即select * from table)中对表进行“完整”选择时,是否保证结果将以分区令牌的递增顺序返回? 例如,有下表:

    create table users(id int, name text, primary key(id));
    

    是否保证下面的查询会返回token列值递增的结果?

    select token(id), id from users;
    

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

  2. 如果上述问题的答案是“是”,那么使用二级索引是否仍然有效?例如,如果我们有以下索引:

    create index on users(name);
    

    我们使用索引查询表:

    select token(id), id from users where name = 'xyz';
    

    对结果的顺序有保证吗?

上述问题的动机是令牌是否适合用于实现分页和/或恢复损坏的较长“数据导出”。

编辑:网络上有多个资源表明订单与令牌订单匹配(例如,在 partitioner resultsthis Datastax page 的描述中):

如果没有在 WHERE 子句中指定分区键,则结果集的实际顺序将取决于用户 ID 的散列值。

但是,Cassandra 官方文档中没有指定结果的顺序,例如。 SELECT statement.

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    是否保证下面的查询会返回token列值递增的结果?

    是的

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。但是有什么理由没有在官方文档中提到这个保证,例如。我提到的 SELECT 查询之一?
    • 因为 1) 使用 Cassandra,最佳实践建议在单个分区上使用 SELECT --> 按集群列值排序的行和 2) 使用第二个索引或不使用分区键的 SELECT 等范围查询通常是不推荐和 3) 仅当使用 Random 或 Murmur3 分区器时,按令牌值排序才为真。使用 ByteOrderedPartitioner 时,行按分区键排序
    猜你喜欢
    • 2017-04-15
    • 2012-08-03
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多