2017-02-10 57 views
3

我正在建模我的表卡桑德拉3.0+。我们的目标是构建一个存储用户的活动,这里是我到目前为止已经做了一个表: (用户ID来自另一个数据库MySQL的)卡桑德拉seconday索引vs物化视图

CREATE TABLE activity (
    userid int, 
    type int, 
    remoteid text, 
    time timestamp, 
    imported timestamp, 
    visibility int, 
    title text, 
    description text, 
    img text, 
    customfields MAP<text,text>, 
PRIMARY KEY (userid, type, remoteid, time, imported)) 

这是我使用的主要疑问:

SELECT * FROM activity WHERE userid = ? AND remoteid = ?; 
SELECT * FROM activity WHERE userid = ? AND type = ? AND LIMIT 10; 

现在我需要在第二个查询上添加第visibility列。所以,从我所了解到的情况来看,我可以选择二级索引物化视图。 这是事实:

  • 这里我有一个分区每个用户和内部有成千上万的行(活动)。
  • 我使用总是分区键(userid)在我所有的查询来访问数据。
  • 全球活动数量为3000万,正在成长。
  • visibility列有低基数(只有3个值),可以更新,但很少。

那么,我应该选择什么?物化视图或索引?我知道低基数的索引是不好的选择,但我的查询总是包含分区键和一个限制,所以也许并不是那么糟糕。

回答

6

如果你总是要使用分区键,我推荐使用二级索引。

物化视图是更好,当你不知道分区键

参考文献:

主要文章!

Cassandra Secondary Index Preview #1

这里是与物化视图和二级指标

Materialized View Performance in Cassandra 3.x

这里是哪里的PK是已知的比较,更有效地使用索引

Cassandra Native Secondary Index Deep Dive

+0

你写道:*当你不知道分区键时,物化视图会更好*但是,这与Tyler Hobbs在[Jira]中写的东西相矛盾(https://issues.apache.org/jira/browse/CASSANDRA-10226 ):*基本表的分区键通常也是MV分区键的不错选择。* – Jubobs

+1

是的,但问题是,什么时候使用其中一个更好? 物化视图信息作为新表存储,这会导致磁盘中的内存更多,次级索引仅将PK存储在“新表”中,并且此表仅存储在PK的节点中。 这是我的观点,并且我总体上支持上述文档。 – HerberthObregon