Indexing 卡桑德拉:哪一个是手动索引的最佳选择

Indexing 卡桑德拉:哪一个是手动索引的最佳选择,indexing,cassandra,manual,Indexing,Cassandra,Manual,首先,请原谅我的英语。这不是我的母语。我正在将一个SQL数据库迁移到Cassandra,但我有一个问题无法解决。假设我有一个存储歌曲的SQL表。每首歌曲都有一个ID作为主键,允许访问其所有相关数据,这些数据存储在该键指定的行的字段中。我也有一些索引搜索使用一些不同的标准,如作者,性别,标题 当我考虑将其转移到Cassandra模式时,我的想法是可以创建一个等效的列族,其中歌曲ID是行键,歌曲属性是列。然后,我可以创建5或6个手动索引,按作者、标题、性别等进行搜索。作者,书名。。。将是列键(添加一

首先,请原谅我的英语。这不是我的母语。我正在将一个SQL数据库迁移到Cassandra,但我有一个问题无法解决。假设我有一个存储歌曲的SQL表。每首歌曲都有一个ID作为主键,允许访问其所有相关数据,这些数据存储在该键指定的行的字段中。我也有一些索引搜索使用一些不同的标准,如作者,性别,标题

当我考虑将其转移到Cassandra模式时,我的想法是可以创建一个等效的列族,其中歌曲ID是行键,歌曲属性是列。然后,我可以创建5或6个手动索引,按作者、标题、性别等进行搜索。作者,书名。。。将是列键(添加一些额外数据以保持其唯一性,使用复合列名),该值将是用于在静态列族中搜索的歌曲ID,其中每一行由歌曲ID标识

但我在这里表示怀疑。更好的方法是:每个索引只存储ID还是存储所有属性?第一个选项允许我减少必要的内存量,但我需要(至少)2次读取才能获得每首歌曲的属性。对于第二个选项,我需要更多的内存,因为每个索引重复相同的信息一次,但通过一次读取,我可以获得我需要的所有属性。我想如果这是一个更快的模式,我可以假设需要额外的内存,但是,它真的会更快吗?拥有一个更大的数据库不会让它工作得更慢吗?或者较慢的操作是搜索索引CF给出的每一行,这是因为Cassandra存储行的方式和2次读取

另一个细节:我计算过,使用第二个选项(将所有属性存储在CF中,作为“索引”)比使用第一个选项(CFs实际上作为索引在歌曲的“主”CF中查找正确的数据)需要大约80%的内存

任何帮助都将不胜感激


提前谢谢

当然,对于不同的数据模型有各种各样的权衡,但听起来您主要关心的是数据集大小和访问速度。Cassandra可以以线性可伸缩的方式处理大量数据,只要您能够为其提供必要的资源来完成这项工作。另一方面,当你做一个get-by-key时,做两次查找是非常便宜的。我的直觉是只存储ID,如果没有其他原因,那就是它使更新属性更容易。然后,如果发现查询速度不够快,可以进行优化。尽管来自RDBMS,但我猜它会非常快。

您还需要检查宽行模式。一些库,比如PlayOrm,为您提供了这种模式,这样您就可以执行类似可伸缩SQL(即使用分区)的操作。您可以有任意多个分区。我相信将来还会有越来越多的NoSql对象映射库……PlayOrm的wiki上也有一个模式页面,其中包含NoSql模式和PlayOrm模式……您可能需要签出NoSql模式。

谢谢)。你是对的,我担心数据的大小和访问速度,但速度对我来说更重要,因为我认为我们可以水平成长并为此付出代价。即使两次访问都很快,我仍然不能确定是否应用第一种方法。很多时候,我们不仅需要得到一首歌曲,而且需要根据搜索过滤器获得很多歌曲,我认为这将是一个基于行键范围的访问。它的工作速度够快吗?或者使用第二种方法,我将在每个搜索条件中有一个宽行,每个列中包含所有歌曲数据,这样更好吗?如果是这样,我不介意大小。如果速度是最重要的,大小不是问题,并且如果您可以有一个保持属性同步的好策略,那么请务必在这两个位置写入数据。卡桑德拉可以接受,如果你可以……:)我的直觉告诉我,宽行是一种更好的方法,但我想知道一些经历过类似情况的专家的看法。非常感谢你,迪恩。我将查看PlayOrm的wiki;)宽行可以进入数百万列。我肯定不会超过1000万,也许不会超过几百万。我们做了100万次,没有任何问题,PlayOrm的连接工作速度也和hibernate+postgres一样快(PlayOrm可以在分区上进行连接,一个分区通常不会超过数百万行)。我们已经做了两个设计,每种方法一个。基于宽行的方法(我提到的第二种方法)旨在将列数保持在100万以下。最宽的行大约有100.000-200.000列,小于5MB。