我再三听到,二级索引(在cassandra中)仅是为了方便,而不是为了提高性能。建议您在基数较低时(例如,性别column具有两个男性或女性值)使用二级索引的唯一情况

考虑这个例子:

CREATE TABLE users (
userID uuid,
firstname text,
lastname text,
state text,
zip int,
PRIMARY KEY (userID)
);


现在,除非在usersfirstname index上创建二级索引,否则我无法执行此查询

select * from users where firstname='john'


我如何对该表进行非规范化,以便可以进行以下查询:
这是使用复合键的唯一有效方法吗?
还有其他选择或建议吗?

CREATE TABLE users (
    userID uuid,
    firstname text,
    lastname text,
    state text,
    zip int,
    PRIMARY KEY (firstname,userID)
    );

最佳答案

为了提供一个好的数据模型,您需要首先确定要执行的所有查询。如果您只需要按用户的名字(或名字和用户ID)查找用户,那么您的第二种设计就可以了...

如果还需要通过用户的姓氏查找用户,则可以创建另一个具有相同字段但主键为(lastname,userID)的表。显然,您将需要同时更新两个表。数据复制在Cassandra中很好。

但是,如果您担心两个或多个表所需的空间,则可以创建一个按用户ID划分的单个用户表,以及要通过以下方式查询的字段的其他表:

CREATE TABLE users (
    userID uuid,
    firstname text,
    lastname text,
    state text,
    zip int,
    PRIMARY KEY (userID)
);

CREATE TABLE users_by_firstname (
    firstname text,
    userid uuid,
    PRIMARY KEY (firstname, userid)
);


该解决方案的缺点是您将需要两个查询来按用户名检索用户:

SELECT userid FROM users_by_firstname WHERE firstname = 'Joe';
SELECT * FROM users WHERE userid IN (...);


希望这可以帮助

关于cql3 - 如何避免 Cassandra 二级索引?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25124993/

10-11 15:08