cassandra中的数据建模可优化搜索结果

时间:2014-07-25 23:07:31

标签: cassandra data-modeling

我只是想知道我是否可以得到一些线索/指针来解决我们那种简单的数据建模问题。 如果有人可以帮助我朝着正确的方向前进,那就太好了。

所以我们有一张平板桌子。文献 其中包含附加到文档的各种元数据 UUID documentId, String organizationId, 整数totalPageCount, 字符串docType, String acountNumber, String branchNumber, 双倍金额,  等等...

我们存储在cassandra中。 UUID是rowkey,我们有一些二级索引,如组织ID。

此表假定持有数百万条记录。 放置正确的索引有助于进行大量查询,但是对于通用查询,我遇到了问题。 如果我抛出一个类似的查询,问题就是100k记录 从文档中选择* orgId =' something'和数量> 5,金额< 50 ...我开始看到所有读取时间问题。 如果我将记录的数量限制为2000,那么查询仍然有效(尽管速度很慢)。

上述问题可以通过适当地放置某些parma来解决,但是根据我们需要搜索的那些列有很多列。

我仍在尝试水平缩放,以便将多个记录放在一行中。

希望有一种方向感。

2 个答案:

答案 0 :(得分:1)

这是一个广泛的问题,一般的解决方案很难给出。但是,这是我的2便士:

您想要查询单个分区以进行快速查询。如果未在查询中点击rowkey,则它是群集范围的操作。因此,从docs中选择*,其中orgId ='something',金额> 5,金额< 50意味着你会遇到问题。点击分区键和索引比使用没有分区键的索引更好。

同样,你不希望单个分区中的所有文档......这是一个明显的热点,更不用说它可能导致大小问题 - 保持在100mb标记附近是一个好主意。每行数千甚至数十万个元数据条目应该没问题 - 尽管这很大程度上取决于您的具体数据。

所以我们想要点击分区键,但也希望利用分配,同时保持效率。嗯.....

您可以创建人造水桶。根据预期的数据量确定所需的存储桶数量。假设每个分区有几十万个,那么n个桶就会给你n *几十万个。使存储桶成为行键。查询时,请使用以下内容:

从文件中选择*,其中包含(...)和orgId ='something'和金额> 5;

[注意:为此,您可能希望将docid作为最后一个聚类键,因此在进行范围查询时不必指定它。]

这将导致n个快速查询命中n个分区,其中n是桶的数量。

另外,请考虑限制结果。你真的一次需要2000条记录吗?

对于某些信息,具有单独的表(即一个表中具有一个特定聚类方案而另一个表中具有另一个特定聚类方案的信息)可能是有意义的。一些信息的复制通常是可以的 - 但同样,这取决于特定的情况。

同样,很难给出一般答案。但这有帮助吗?

答案 1 :(得分:1)

问题不在于Cassandra,而在于您的数据模型。你需要从关系思维转向nosql-cassandra思考。在Cassandra中,如果你想获得不错的O(1)速度,首先要编写查询。在Cassandra中使用二级索引坦言是一个糟糕的选择。这是因为您的索引是分布式

如果您事先不了解您的查询,请使用其他技术,但不使用Cassandra。关系服务器非常好,如果你可以在1台服务器上安装所有数据,否则看看ElasticSearch

其他选项是使用Datastax版本,其中包含用于全文搜索的Solr。

最后,您可以使用多个表来复制信息。这将允许您查询特定属性。此过程称为反规范化,其思路是获取对象的属性,使其成为主键并将其插入到自己的表中。结果是您可以在O(1)时间内查询该特定表的特定属性值。缺点是您现在必须复制数据。