我有下表(使用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路合并但具有相当低的限制。
任何提示,建议或指向代码的指示都将受到赞赏。
答案 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。