Cassandra CQL3按群集密钥效率排序(带限制子句?)

Cassandra CQL3按群集密钥效率排序(带限制子句?),cassandra,query-performance,cql3,cqlsh,Cassandra,Query Performance,Cql3,Cqlsh,我有下表(使用CQL3): 我想按tuuid排序行。但这只有在我限制碎片时才可能——我知道这是由于性能 我使用shard纯粹是为了切分,我可以将它的值范围限制在某个小范围[0-16]内,比如说。然后,我可以运行如下查询: 从测试中选择*,其中按tuuid limit L以(0,…,15)顺序分片 表中可能有数百万行,因此我想了解这种order by查询的性能特征。一般来说,性能可能非常差,但如果使用一个合理数量的limit子句(顺序为10K),这可能不会太差-即16路合并,但限制相当低 任何提示

我有下表(使用CQL3):

我想按tuuid排序行。但这只有在我限制碎片时才可能——我知道这是由于性能

我使用shard纯粹是为了切分,我可以将它的值范围限制在某个小范围[0-16]内,比如说。然后,我可以运行如下查询:

从测试中选择*,其中按tuuid limit L以(0,…,15)顺序分片

表中可能有数百万行,因此我想了解这种order by查询的性能特征。一般来说,性能可能非常差,但如果使用一个合理数量的limit子句(顺序为10K),这可能不会太差-即16路合并,但限制相当低


任何提示、建议或代码中的指针都将非常感谢。

您的数据将根据您的列键进行排序。因此,上述查询中合并的性能问题不会因为where子句而发生,而是因为您的LIMIT子句afaik

您的列是按照tuuid的顺序插入的,因此没有性能问题

如果一次获取的行太多,我建议创建一个test_元表,每个X-insert在其中存储最新的timeuuid,以获取查询将获取的行的上限。然后,您可以将查询更改为:

从测试中选择*,其中(0,…,15)中的碎片,tuuid>x,tuuid 简而言之:利用列键并摆脱限制。或者,在Cassandra 2.0中,分页也会有所帮助

另一个我无意中发现的问题,你这么说

我的表中可能有数百万行

但是,根据您的数据模型,您将拥有精确的行分片数。这是您的行键,与分区器一起将决定数据的分布/分片

希望有帮助

更新

从我个人的经验来看,cassandra在大量读取和写入时都表现得相当好。如果结果集变得太大,我宁愿在接收/客户端遇到内存问题,而不是在服务器端超时。不过,为了防止这两种情况发生,我建议看一看即将推出的(2.0)分页功能

与此同时:

尝试使用以下方法进行调查

如果您主要阅读“最新”的数据,请尝试


对于缓存等常规优化,首先请阅读how,然后请参阅。

您的数据是根据列键排序的。因此,在上面的查询中,合并中的性能问题不会因为WHERE子句而发生,而是因为LIMIT子句afaik

您的列是按照tuuid的顺序插入的,因此没有性能问题

如果一次获取的行太多,我建议创建一个test_元表,每个X-insert在其中存储最新的timeuuid,以获取查询将获取的行的上限。然后,您可以将查询更改为:

从测试中选择*,其中(0,…,15)中的碎片,tuuid>x,tuuid 简而言之:利用列键并摆脱限制。或者,在Cassandra 2.0中,分页也会有所帮助

另一个我无意中发现的问题,你这么说

我的表中可能有数百万行

但是,根据您的数据模型,您将拥有精确的行分片数。这是您的行键,与分区器一起将决定数据的分布/分片

希望有帮助

更新

从我个人的经验来看,cassandra在大量读取和写入时都表现得相当好。如果结果集变得太大,我宁愿在接收/客户端遇到内存问题,而不是在服务器端超时。不过,为了防止这两种情况发生,我建议看一看即将推出的(2.0)分页功能

与此同时:

尝试使用以下方法进行调查

如果您主要阅读“最新”的数据,请尝试


对于缓存等一般优化,首先,阅读how,然后,请参阅。

是的,我应该详细说明-我的错误。tuuid列正好用于“where tuuid>”。其想法是我得到一批行(按tuuid asc排序)并返回它们,然后让客户端在下一次查询中使用成功处理的最后一个tuuid。但这确实意味着我需要order by tuuid子句,这将需要跨碎片合并。这是我想要了解的性能。在您对行数的评论中,我指的是逻辑行数。这将产生影响应该是宽行(PK的其余部分是列名)。是的,我应该详细说明-我的错误。tuuid列正好是用于“where tuuid>”的。我的想法是得到一批行(按tuuid asc排序)并返回它们,然后让客户端在下一次查询中使用成功处理的最后一个tuuid。但这确实意味着我需要order by tuuid子句,这将需要跨碎片合并。这是我想要了解的性能。在您对行数的评论中,我指的是逻辑行数。这将产生影响可以是宽行(PK的其余部分是列名)。
create table test (
  shard text,
  tuuid timeuuid,
  some_data text,
  status text,
  primary key (shard, tuuid, some_data, status)
);