这个有点长,所以我不能发表评论......对不起。
我知道这听起来有点奇怪,尤其是对于您项目的后期阶段,但问题是随着时间的推移,索引情况不会好转。我强烈建议您开始制作自己的表格,而不仅仅是将索引放在以下内容上。根据访问数据的频率,您可以使用“倒排索引”。
CREATE INDEX links_by_author_url_idx ON keyspace.links_by_author (url);
CREATE INDEX docs_url_idx ON keyspace.docs (url);
CREATE INDEX om_master_object_id_idx ON keyspace.om (master_object_id);
CREATE INDEX actions_pday_idx ON keyspace.actions (pday);
CREATE INDEX authors_yauid_idx ON keyspace.authors (yauid);
CREATE INDEX authors_login_lr_idx ON keyspace.authors (login_lr);
CREATE INDEX authors_login_idx ON keyspace.authors (login);
CREATE INDEX authors_email_idx ON keyspace.authors (email);
CREATE INDEX authors_name_idx ON keyspace.authors (name);
基本上,您在此处拥有的每个索引都使您能够“搜索”基本实体以通过某种条件找到它们。大多数条件实际上都非常狭窄,这是一个好消息。但问题是索引将变得庞大(已经如此),尤其是在文档和作者上。但我想doc的问题更大。
您应该考虑为此制作单独的表格。您创建的每个索引都将存在于集群中的每个节点上,最终您将拥有比您真正需要的数据多得多的数据,因为在后台,每个节点的数据都会成倍增加。当您向该系统添加复制因子时,您甚至都没有意识到会占用大量空间。
加入节点的问题在于,当它们接收到新数据时,集群中的所有数据都需要重建……对于集群中的每个节点,这会花费你很多时间。所以基本上你失去了 cassandra 所拥有的“简单节点加入”的所有好处。
现在您可能会认为,当您将数据写入非规范化的新模式时,空间会成为问题......
如果空间是问题,您可以使用一种称为倒排索引的技术,您只需将信息的 id 放入搜索表中,然后在主表中进行第二次加载。我在一些空间是问题的项目中使用了它,但是由于您拥有所有主要内容,索引空间可能不会成为问题,因为您已经使用了比您想象的更多的东西。(我敢打赌,您也可能会大大节省空间)
无论如何,所有索引都应该变成表......如果一致性有问题,请使用批处理(不要使用物化视图,因为您可能会丢失数据)。
我诚实的提示是你远离索引。我知道重构它是地狱,而且很难有时间重构:(但我认为它应该是可以管理的。