Cassandra物化视图和IN查询的缺陷是什么?

时间:2016-03-16 18:30:02

标签: events cassandra data-modeling materialized-views

我们说我有一张桌子

$ python -m timeit -s 'from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0); c = np.random.rand(20,30)' 'a,b = linear_sum_assignment(c)'
100 loops, best of 3: 3.43 msec per loop
$ python -m timeit -s 'from munkres import munkres; import numpy as np;  np.random.seed(0); c = np.random.rand(20,30)' 'a = munkres(c)'
10000 loops, best of 3: 139 usec per loop
$ python -m timeit -s 'from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0);' 'c = np.random.rand(20,30); a,b = linear_sum_assignment(c)'
100 loops, best of 3: 3.01 msec per loop
$ python -m timeit -s 'from munkres import munkres; import numpy as np; np.random.seed(0)' 'c = np.random.rand(20,30); a = munkres(c)'
10000 loops, best of 3: 127 usec per loop

请求模式是我需要通过CREATE TABLE events ( stream_id text, type text, data text, timestamp timestamp, PRIMARY KEY (stream_id, timestamp) ); 获取所有事件 例如stream_id

然后我需要给出一组SELECT * FROM events WHERE stream_id = 'A-1'; s的所有事件。所以我创建了一个MV:

type

请求就像是 CREATE MATERIALIZED VIEW events_by_type AS SELECT * FROM events WHERE type IS NOT NULL AND timestamp IS NOT NULL PRIMARY KEY (type, stream_id, timestamp) WITH CLUSTERING ORDER BY (timestamp DESC);

此查询模式和数据模型存在哪些缺陷? 如果有,是否有可能改善它?

2 个答案:

答案 0 :(得分:2)

我只能想到你可能遇到的陷阱是与视图的一致性没有反映在写入基表的一致性级别上。因此,如果您需要更强的一致性(读取和写入的仲裁),您可能会遇到问题。

一个问题是您的分区是无限制的。在当前版本中,如果您的建筑物大于100mb左右的分区,您可以开始出现misc性能问题(有效,但有时需要进行GC调整以保持活动)。这种情况最近有所改善,但您应该分解一些分区。即。

CREATE TABLE events (         
  stream_id text,
  time_bucket text,
  type text,         
  data text,         
  timestamp timestamp,         
  PRIMARY KEY ((stream_id, time_bucket), timestamp)
);

CREATE MATERIALIZED VIEW events_by_type AS
  SELECT * FROM events WHERE
    type IS NOT NULL AND
    time_bucket IS NOT NULL AND
    timestamp IS NOT NULL 
PRIMARY KEY ((type, time_bucket), stream_id, timestamp)
WITH CLUSTERING ORDER BY (timestamp DESC);

它增加了您time_bucket需要知道的复杂性。您可以将桶预定义为每天(例如2016-10-10 00:00:00),也可以创建一个新表来映射类型或stream_id的可能time_buckets。

答案 1 :(得分:1)

这也可能是旧式二级指数是合理选择的情况。假设有一个合理的有限但不是很少的类型,二级索引可以正常工作。 (如果只有极少数不同的类型,那么在物化视图中也可能遇到大分区的问题。)