卡桑德拉索引多列

时间:2018-12-05 13:01:49

标签: indexing cassandra

Datastax文档讨论了有关创建多个二级索引here的问题。但是当我不得不使用两个索引在where子句中查询时,文档建议使用允许过滤。 1)我担心在生产中使用允许过滤和 2)如果我要使用允许过滤,那么在我总是必须同时使用这两个索引的情况下,这不会破坏这些索引的全部目的。

可能的解决方案似乎是在两列上都使用自定义索引,但是apache文档here有点含糊,也没有谈到它们的性能。

当我需要查询多个二级索引时,建议的方法是什么?解决此问题的任何意见都会有所帮助。

EDIT1:在此link上可以用Java类表示我的cassandra表的视图。我必须使用col1 ='val1'和col2 ='val2'和col3 ='val3'

进行查询

EDIT2:我确实考虑过使用col1,2,3的数据创建一个新列,例如newcol ='val1val2val3',这样我就可以在newcol上创建一个二级索引并消除这个难题,但这似乎是有点骇人听闻,而不是策略性的。任何对此计划的评论将不胜感激。 PS:此newcol将具有中等基数。

EDIT3:我确实找到了有关二级索引的好信息,并允许过滤here似乎有帮助

2 个答案:

答案 0 :(得分:1)

1)你应该。我强烈建议您避免使用二级索引,并且允许过滤将其视为特殊情况的高级功能。

2)使用索引可能会更有效,但仍然很糟糕,而且还会以其他新方式造成可怕。只有极少数情况下可以接受二级索引。在极少数情况下,允许进行过滤。您正在看两者的重叠。

也许退后一步。您正在构建表示对象的pojos,然后尝试将其映射到Cassandra中。使用Cassandra进行数据建模时应该采取的方法是考虑要进行的查询并设计与之匹配的表-而不是数据。通常会在更改时以多个表进行更新(磁盘空间和写操作都很便宜),这样您的读操作可以高效地命中1个分区,并且一击即可获得所需的一切,这是正常的。反规范化数据,Cassandra没有关系,并且第三范式在这里通常是一件坏事。

答案 1 :(得分:0)

在您的用例中,最糟糕的情况是考虑搜索一位出生于1756年的奥地利作曲家。是的,您可以通过与国籍指数=奥地利(该指数)相交,在所有曾经生活的人的表中找到他(莫扎特)出生= 1756,职业指数=作曲家。但是Cassandra会非常无效率地实现这样的查询-它要么需要检索庞大的列表并将其相交,要么实际上是只检索一个庞大的列表(例如,曾经生活过的所有奥地利人的列表),然后根据其他标准(出生和职业)。这就是为什么您需要“允许过滤”的原因。以及为什么不建议将其用作Cassandra原始二级索引的用例。

与Cassandra最初的次要索引不同,搜索引擎正是针对此类交集,并具有可有效计算它们的特殊算法。尤其是,搜索引擎通常具有“跳过列表”,从而可以根据第二个列表中的条目快速跳过其中一个列表,从而找到两个冗长列表的较小交集。他们还具有从哪个列表开始的逻辑(较短的列表,即稀有单词)。

您可能知道,Cassandra具有 second 二级索引实现,称为SASI。 SASI(请参见https://github.com/apache/cassandra/blob/trunk/doc/SASI.md)比Cassandra最初的二级索引实现有许多面向搜索引擎的改进,如果我正确理解(我从未尝试过)的话,高效的交集就是其中之一。因此,在您的用例中,也许切换到SASI是个好主意。