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

时间:2013-08-14 07:23:13

标签: cassandra query-performance cql3 cqlsh

我有下表(使用CQL3):

create table test (
  shard text,
  tuuid timeuuid,
  some_data text,
  status text,
  primary key (shard, tuuid, some_data, status)
);

我想获得tuuid订购的行。但这只有在我限制分片时才有可能 - 我得到这是因为性能。

我将碎片纯粹用于分片,我可以将其值范围限制在某个小范围内[0-16]。然后,我可以运行这样的查询:

  

从测试中选择*,其中(0,...,15)中的碎片按tuuid limit L顺序排列;

我可能在表中有数百万行,所以我想通过查询了解这样一个订单的性能特征。看起来一般来说性能可能非常差,但是有一些合理数量的限制条款(10K的数量级),这可能不是那么糟糕 - 即16路合并但具有相当低的限制。

任何提示,建议或指向代码的指示都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

您的数据根据​​列密钥排序。因此,由于WHERE子句而导致上面查询中的合并中的性能问题不会发生,但由于您的LIMIT子句,afaik。

根据tuuid,您的列按IN ORDER插入,因此没有性能问题。

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

  

从测试中选择*,其中(0,...,15)中的碎片和tuuid> x和tuuid< ÿ;

简而言之:使用你的列密钥并摆脱限制。或者,在Cassandra 2.0中,也会有分页,这也有帮助。

我偶然发现了另一个问题,你说那个

  

表格中可能有数百万行

但根据您的数据模型,您将拥有 shard 行数。这是您的行键,并且 - 与分区程序一起 - 将确定数据的分布/分片。

希望有所帮助!

<强>更新

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

同时:

尝试使用trace functionality in 1.2进行调查。

如果您主要阅读“最新”数据,请尝试adding a reversed type

对于缓存等常规优化,首先请阅读cassandra handles reads on a node的方法,然后参阅this tuning guide