Nosql Cassandra将综合指数和次级指数结合起来
我们希望使用cassandra存储复杂数据Nosql Cassandra将综合指数和次级指数结合起来,nosql,cassandra,cql,Nosql,Cassandra,Cql,我们希望使用cassandra存储复杂数据 但我们不知道如何组织索引 我们的表(列族)如下所示: Users = { RandomId int, Firstname varchar, Lastname varchar, Age int, Country int, ChildCount int } 我们的查询包含必填字段(Firstname、Lastname、Age)和额外的搜索选项(Country、ChildCount)。 我们应该如何
但我们不知道如何组织索引 我们的表(列族)如下所示:
Users =
{
RandomId int,
Firstname varchar,
Lastname varchar,
Age int,
Country int,
ChildCount int
}
我们的查询包含必填字段(Firstname、Lastname、Age)和额外的搜索选项(Country、ChildCount)。我们应该如何组织索引以加快此类查询 首先,我认为,在(名字、姓氏、年龄)上建立综合索引,并在其余字段(国家和儿童计数)上添加单独的二级索引是很自然的。
但在创建二级索引之后,我不能将行插入表中,也不能查询表 使用
- 卡桑德拉1.1.0
- 带有--cql3选项的cqlsh
欢迎提出任何其他解决问题的建议(带有强制性和附加选项的复杂查询)。这是我的想法。您可以简单地创建一个列族,使用您的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]];
这可能是一个很好的参考
如果我错了,请告诉我 对于涉及大量分区的查询,索引不是很有效 我认为最好是根据您想要进行的查询来考虑表:您需要一个用于基于用户名的查询的表,而这似乎是存储有关用户的所有信息的正确位置。另一方面,我假设,你希望能够基于国家进行搜索,以提供一个用户列表:因此,你并不需要所有的信息,可能只是名字和姓氏,或者只是电子邮件等。然后,另一个表可以这样做 这涉及到一些数据复制,但更符合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)
);