Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cassandra中优化搜索结果的数据建模_Cassandra_Data Modeling - Fatal编程技术网

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

cassandra中优化搜索结果的数据建模,cassandra,data-modeling,Cassandra,Data Modeling,我只是想知道我是否能找到一些线索/指针来解决我们这种简单的数据建模问题。 如果有人能在正确的方向上帮助我,那就太好了 所以我们有一个平面表格,比如文件 它将各种元数据附加到文档中,如 UUID文档ID, 字符串organizationId, 整数totalPageCount, 字符串docType, 字符串A个数字, 字符串分支编号, 双倍金额, 等等等等 我们正在卡桑德拉储存。 UUID是行键,我们有一些二级索引,比如organization Id 这张桌子实际上可以容纳数百万条记录。 放置适

我只是想知道我是否能找到一些线索/指针来解决我们这种简单的数据建模问题。 如果有人能在正确的方向上帮助我,那就太好了

所以我们有一个平面表格,比如文件 它将各种元数据附加到文档中,如 UUID文档ID, 字符串organizationId, 整数totalPageCount, 字符串docType, 字符串A个数字, 字符串分支编号, 双倍金额, 等等等等

我们正在卡桑德拉储存。 UUID是行键,我们有一些二级索引,比如organization Id

这张桌子实际上可以容纳数百万条记录。 放置适当的索引有助于处理许多查询,但对于一般查询,我却束手无策。 问题是,如果我输入一个查询,比如 从orgId='something'和amount>5和amount<50的文档中选择*我开始看到所有读取超时问题。 如果我将记录数限制在2000个左右,查询仍然有效(尽管速度相当慢)

上述问题可以通过适当地放置某些参数来解决,但我们需要根据其中的几十列进行搜索

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


希望有方向感。

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

您希望查询命中单个分区以进行快速查询。如果在查询中未点击行键,则这是一个集群范围的操作。因此,从orgId='something'和amount>5且amount<50的文档中选择*表示您将有问题。命中分区键和索引比不命中分区键的索引要好得多

同样,您不希望所有文档都在一个分区中…这是一个明显的热点,更不用说它会导致大小问题-将一行保持在100mb左右是一个好主意。每行几千个甚至几十万个元数据条目就可以了——尽管这在很大程度上取决于您的特定数据

因此,我们希望命中分区键,但也希望利用分布,同时保持效率。嗯

您可以创建人工桶。根据预期的数据量决定需要多少存储桶。假设每个分区有几十万个存储桶,那么n个存储桶将为您提供n*几十万个存储桶。将bucket id设置为行键。查询时,请使用以下内容:

从bucketid位于(…)且orgId='something'和amount>5的文档中选择*

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

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

也要考虑限制你的结果。你真的一次需要2000条记录吗

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


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

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

如果您事先不知道您的查询,请使用其他技术,但不要使用Cassandra。关系服务器真的很好,如果您可以将所有数据放在一台服务器上,那么请看一看

另一个选择是使用Datastax edition,它包含用于全文搜索的Solr


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

谢谢Asic。我也在朝着同样的方向思考,但感谢您确认这一点。我正在努力解决的唯一问题是很难找到bucket ID,因为查询可能非常临时。这只是一种方法。在本例中,您将决定对特定类型的数据使用n个bucket。对于查询该类型的数据,您需要使用该类型的所有存储桶。这样,您就可以在执行多个分区的同时访问分区。您可以获得n的预期上限(例如,3-4)并查询大量数据。我们这里说的是4个完整分区。这确实需要一点计划,但除了难以置信的数据量之外,这应该不会太难(把“他就是这么说的”笑话排成一列!!)。