Cassandra SASI 索引或物化视图 - 性能提升

Cassandra SASI index or materialized view - performance improvement

我目前正在优化我的应用程序,我想找出在以下情况下哪种方式会更快、性能更好。

我有一个包含 4 个字段的 table - id, user, status, entryTime

我每 10 秒向该端点写入大约 100 次,因此平均每秒写入 10 次。

主键为user,聚簇键为entryTime and id

我有一个端点,我需要在其中检索特定用户的特定 entryTime 之间的所有条目,例如,对于 ID 为 1 的用户,其中 entryTime 大于 2019-06-04T07:58:28.000Z 且小于 2019-06-04T08:58:28.000Z.

另一个端点是,我必须为特定用户检索特定 status

使用不同的键为第二个端点(我需要检索状态的地方)创建物化视图更好,还是添加 SASI 索引更好?

由于 table 也经常更新,并且经常写入,根据我的阅读,写入大约需要 10% 的性能,但它是否适用于所有 tables,哪个有频繁 read/writes?

是否有任何供将来参考的检查点,我可以按照这些检查点来确定我应该使用物化视图还是 SASI 索引?

我对 SASI 索引没有任何经验,但是,我可以通过 STATUS 列告诉您这一点,并且我假设如果您创建一个 MVIEW 作为分区键(因此您可以按它进行过滤),每次主 table 上的状态发生变化时,MVIEW 将执行 DELETE,然后执行 INSERT(也使用查找)。根据您的负载(10 writes/second - 不确定其中有多少是更新),这在 MVIEW 上可能会出现问题。我们使用MVIEWS,但是负载很轻。查询对它们非常有效。不确定这是否有帮助

@JimWartnick 完全可以。感谢您澄清这一点!不经常更新的 table 是否应该使用物化视图?

我认为这有帮助,但不是必需的。请记住,Cassandra 首先在基础 table 上进行更改,然后将其传播到 MVIEW。所以同样的复制问题也适用。此外,MVIEW 可能会错过更改,从而导致它不同步。修复它的唯一方法是重建 MVIEW。 MVIEW 的一个好处是它确实允许您将 updatable/changable 列作为分区键的一部分,这在独立的 table 上是不允许的。缺点是它确实执行了额外的操作(同样,删除后插入)。这可能会导致额外的负载