Cassandra索引与物化视图

时间:2016-04-07 12:46:42

标签: cassandra

我有下一个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'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

这就是我看到两个选项的原因:

  1. 在流量列上创建索引。
  2. 创建物化视图。
  3. 创建另一个表格并为INDEX列设置traffic
  4. 哪个是最佳选择?另外,我有许多MAP类型的字段,我需要在其中进行过滤。如果在每个字段中我会添加INDEX

    ,可能会出现什么问题

    谢谢。

1 个答案:

答案 0 :(得分:3)

来自When to use an index

  

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

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

如果您的计划用量符合这些条件中的一个或多个,则最好使用实体化视图。