Cassandra使用复合索引和二次合并

时间:2012-05-31 09:03:13

标签: nosql cassandra cql

我们想用cassandra来存储复杂的数据 但我们无法弄清楚如何组织索引。

我们的表(列族)如下所示:

Users =
  { 
    RandomId int,
    Firstname varchar,
    Lastname varchar,
    Age int,
    Country int,
    ChildCount int
  }

我们有必填字段(名字,姓氏,年龄)和额外搜索选项(Country,ChildCount)的查询。
我们应该如何组织索引以更快地进行此类查询?

首先我想,在(名字,姓氏,年龄)上创建综合索引并在剩余字段(Country和ChildCount)上添加单独的二级索引是很自然的。
但是在创建二级索引后我无法在表中插入行,我无法查询该表。

使用

  • cassandra 1.1.0
  • cqlsh with --cql3 option。

欢迎任何其他解决我们问题的建议(带有强制性和附加选项的复杂查询)。

2 个答案:

答案 0 :(得分:2)

这是我的想法。您可以简单地创建一个列族,其中RandomId作为行键,所有剩余的字段只作为列(例如列名'firstname',列值'jonh')。在此之后,您必须为每个列创建二级索引。你的价值观的基数似乎很低,所以应该稍微高效。

CQL代码应该是这样的:

create column family users with comparator=UTF8Type and column_metadata=[{column_name:  firstname, validation_class: UTF8Type,index_type: KEYS},
{column_name: lastname, validation_class: UTF8Type, index_type: KEYS},
{column_name: contry, validation_class: IntegerType, index_type: KEYS},
{column_name: age, validation_class: IntegerType, index_type: KEYS]},
{column_name: ChildCount, validation_class: IntegerType, index_type: KEYS]];

它的一个很好的参考可能是http://www.datastax.com/docs/0.7/data_model/secondary_indexes

如果我错了,请告诉我。

答案 1 :(得分:1)

对于涉及大量分区的查询,索引效率不高。

我认为最好根据您想要进行的查询来考虑这些表:您需要一个基于用户名的查询表,这似乎是存储有关用户的所有信息的正确位置。另一方面,你希望能够根据国家进行搜索,我假设,提供一个用户列表:因为你并不真正需要所有的信息,可能只是名字和姓氏,或只是电子邮件,等等。另一张表可以做到。

这涉及一些数据重复,但更符合Cassandra数据建模思路。

这会给:

CREATE TABLE users(
   id UUID,
   lastname TEXT,
   firstname TEXT,
   age INT,
   country TEXT,
   childcount INT,
   PRIMARY KEY(UUID)
);

CREATE TABLE users_by_country(
   country TEXT,
   firstname TEXT,
   lastname TEXT,
   user_uuid UUID,
   PRIMARY KEY((country), firstname, lastname)
);

CREATE TABLE users_by_age(
   age INT,
   firstname TEXT,
   lastname TEXT,
   user_uuid UUID,
   PRIMARY KEY((age), firstname, lastname)
);