Cassandra 索引与物化视图

Posted

技术标签:

【中文标题】Cassandra 索引与物化视图【英文标题】:Cassandra indexes vs materialized view 【发布时间】:2016-04-07 12:46:42 【问题描述】:

我有下一个 Cassandra 表结构:

CREATE TABLE ringostat.hits (
  hitId uuid,
  clientId VARCHAR,
  session MAP<VARCHAR, TEXT>,
  traffic MAP<VARCHAR, TEXT>,
  PRIMARY KEY (hitId, clientId)
);

INSERT INTO ringostat.hits (hitId, clientId, session, traffic)
  VALUES('550e8400-e29b-41d4-a716-446655440000'. 'clientId', 'id': '1', 'number': '1', 'startTime': '1460023732', 'endTime': '1460023762', 'referralPath': '/example_path_for_example', 'campaign': '(not set)', 'source': 'www.google.com', 'medium': 'referal', 'keyword': '(not set)', 'adContent': '(not set)', 'campaignId': '', 'gclid': '', 'yclid': '');

INSERT INTO ringostat.hits (hitId, clientId, session, traffic)
      VALUES('650e8400-e29b-41d4-a716-446655440000'. 'clientId', 'id': '1', 'number': '1', 'startTime': '1460023732', 'endTime': '1460023762', 'referralPath': '/example_path_for_example', 'campaign': '(not set)', 'source': 'www.google.com', 'medium': 'cpc', 'keyword': '(not set)', 'adContent': '(not set)', 'campaignId': '', 'gclid': '', 'yclid': '');

INSERT INTO ringostat.hits (hitId, clientId, session, traffic)
      VALUES('750e8400-e29b-41d4-a716-446655440000'. 'clientId', 'id': '1', 'number': '1', 'startTime': '1460023732', 'endTime': '1460023762', 'referralPath': '/example_path_for_example', 'campaign': '(not set)', 'source': 'www.google.com', 'medium': 'referal', 'keyword': '(not set)', 'adContent': '(not set)', 'campaignId': '', 'gclid': '', 'yclid': '');

我想选择source='www.google.com' AND medium='referal' 所在的所有行。

SELECT * FROM hits WHERE traffic['source'] = 'www.google.com' AND traffic['medium'] = 'referal' ALLOW FILTERING;

没有添加ALLOW FILTERING我得到错误:No supported secondary index found for the non primary key columns restrictions

这就是为什么我看到两个选项:

    在流​​量列上创建索引。 创建物化视图。 创建另一个表并为traffic 列设置INDEX

哪个是最好的选择?此外,我有很多 MAP 类型的字段,我需要对其进行过滤。如果我在每个字段上添加INDEX 会出现什么问题?

谢谢。

【问题讨论】:

您应该考虑将最后一个问题作为一个单独的问题提出。 【参考方案1】:

来自When to use an index。

在这些情况下不要使用索引:

在高基数列上,因为您随后会针对少量结果查询大量记录。 [...] 相反,在基数极低的列(例如布尔列)上创建索引是没有意义的。 在使用计数器列的表中 在经常更新或删除的列上。 除非经过严格查询,否则在大分区中查找一行。

如果您的计划使用满足这些标准中的一个或多个,最好使用物化视图。

【讨论】:

在我的物化视图中,我需要在traffic 列上添加索引? 不,您要查询的列需要按顺序在 PRIMARY KEY 中。 但是我有 MAP 类型。我不能在这种类型上设置 PRIMARY KEY :( 那么你必须使用索引,或者重塑你的数据。物化视图无济于事。 我认为将traffic 列分隔在不同的列中,如traffic.source VARCHARtraffic.medium VARCHAR 会有所帮助。谢谢你:)

以上是关于Cassandra 索引与物化视图的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 索引视图与 Oracle 物化视图

视图与索引视图或物化视图之间的区别

PG 物化视图

Cassandra 3.0 的新特性: 物化视图

如何在 python Cassandra 驱动程序中的物化视图上使用准备好的语句?

oracle物化视图不会自动更新是怎么回事